如何在opencl

时间:2017-03-15 18:57:42

标签: c++ opencv image-processing opencl

问题

我有opencl代码,必须以cv::mat作为输入并返回cv::mat作为输出。

现在我将输入转换为常规字符数组并将其传递给opencl并将输出(char数组)转换为cv::mat

我拥有什么

我尝试使用cv::mat原始数据,但数据中存在一些差距。出于这个原因,我将cv::mat复制到连续数组,但我确信我可以强制opencl使用带有间隙的数据。

问题

有人可以解释如何避免将数据复制到数组和从数组复制数据,并直接使用cv::mat作为输入和输出吗?

2 个答案:

答案 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];
    }
}

当然,您需要根据数据类型进行调整。