繁体   English   中英

如何在opencl中使用cv :: mat

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM