[英]How to use cv::mat in opencl
我有opencl代码,必须将cv::mat
作为输入并返回cv::mat
作为输出。
现在,我将输入转换为chars的常规数组,并将其传递给opencl并将输出(即char数组)转换为cv::mat
。
我尝试使用cv::mat
原始数据,但是数据中存在一些空白。 因此,我将cv::mat
复制到连续数组,但是我确定可以强制opencl使用具有gaps的数据。
有人可以解释我如何避免在数组之间cv::mat
复制数据,而直接使用cv::mat
作为输入和输出吗?
也许此答案可以帮助您解决以下问题: 如何在OpenCV(3.0.0)OCL中启动自定义OpenCL内核?
您也许可以使用OpenCV提供的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);
据我了解,您应该可以使用cv::ocl::KernelArg::ReadWrite(output_gpu)
将UMat
直接传递给内核。 该垫子的内核参数将是__global uchar*
。 不过我不确定,到目前为止,我仅将OpenCV与CUDA结合使用。
数组到Mat :您可以使用“ 指向用户分配的数据的矩阵头的构造函数 ”(请参见此答案 ):
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat to Ptr :您可以使用data属性 (来自此答案 )
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];
}
}
当然,您需要使它适应您的数据类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.