我有opencl代码,必须以cv::mat
作为输入并返回cv::mat
作为输出。
现在我将输入转换为常规字符数组并将其传递给opencl并将输出(char数组)转换为cv::mat
。
我尝试使用cv::mat
原始数据,但数据中存在一些差距。出于这个原因,我将cv::mat
复制到连续数组,但我确信我可以强制opencl使用带有间隙的数据。
有人可以解释如何避免将数据复制到数组和从数组复制数据,并直接使用cv::mat
作为输入和输出吗?
答案 0 :(得分:1)
也许这个答案可以帮助您解决问题:How to launch custom OpenCL kernel in OpenCV (3.0.0) OCL?
您可以使用OpenCV提供的curl_getinfo($ch)
类。
UMat
根据我的理解,您应该能够将cv::Mat mat = ...;
// Upload input mat
cv::UMat input_gpu = mat.getUMat(cv::ACCESS_READ, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
// Create output mat on the GPU
cv::UMat output_gpu(mat_src.size(), CV_32F, cv::ACCESS_WRITE, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
// Download output mat
cv::Mat output = output_gpu.getMat(cv::ACCESS_READ);
直接传递给您的内核
使用UMat
。那个mat的内核参数将是cv::ocl::KernelArg::ReadWrite(output_gpu)
。我不确定,到目前为止,我只将OpenCV与CUDA结合使用。
答案 1 :(得分:0)
数组到匹配:您可以使用“constructor for matrix headers pointing to user-allocated data”(请参阅this answer):
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat to Ptr :您可以使用data attribute(来自this answer)
unsigned char *input = (unsigned char*)(img.data);
for(int j = 0;j < img.rows;j++){
for(int i = 0;i < img.cols;i++){
unsigned char b = input[img.step * j + img.channels() * i ] ;
unsigned char g = input[img.step * j + img.channels() * i + 1];
unsigned char r = input[img.step * j + img.channels() * i + 2];
}
}
当然,您需要根据数据类型进行调整。