Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将OpenCLGPU内存映射到OpenCV矩阵?_Opencv_Opencl - Fatal编程技术网

如何将OpenCLGPU内存映射到OpenCV矩阵?

如何将OpenCLGPU内存映射到OpenCV矩阵?,opencv,opencl,Opencv,Opencl,我用OpenCL在gpu上计算了一些矩阵,现在我需要用OpenCV在上面做一些过滤。我怎样才能用最少的开销来做呢 cl::Buffer buffer; cl::Kernel kernel; kernel = cl::Kernel(program, "functionName", &err); buffer = cl::Buffer(context, CL_MEM_READ_WRITE, size, NULL, &err); kernel.setArg(0, buffer); qu

我用OpenCL在gpu上计算了一些矩阵,现在我需要用OpenCV在上面做一些过滤。我怎样才能用最少的开销来做呢

cl::Buffer buffer;
cl::Kernel kernel;
kernel = cl::Kernel(program, "functionName", &err);
buffer = cl::Buffer(context, CL_MEM_READ_WRITE, size, NULL, &err);
kernel.setArg(0, buffer);
queue_IQ.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(size), cl::NullRange, NULL, NULL);

// Here, I would like to map the content of buffer to cv::Mat.

它可以用很少的开销实现:

在我的例子中,将gpu内存映射到一个指针float*。 使用此指针创建opencv矩阵。注意,opencv矩阵构造函数不会为指针复制或分配新内存,而是初始化矩阵头以指向gpu上的指定数据。 例如,如果您正在使用浮动:

// cl::Buffer buffer
float* dataOnGPU = static_cast<float *>(queue_IQ.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, dataSize, NULL, NULL, NULL)); // map GPU memory to float*
cv::Mat dataInMat(height, width, CV_32F, dataOnGPU); // interface float* with cv::Mat

...

// Once done, you can unmap
queue_IQ.enqueueUnmapMemObject(buffer, dataOnGPU, NULL, NULL);
有关详细信息,请参阅:


虽然一般的问题和答案有点简短,可以详细阐述,但我认为这可能是一个合理的问题。如果你详细阐述了问题,并在回答中添加了一些进一步的提示,例如提及或链接到,我想我会对它们进行投票。我想,如果你认为有必要提供更多信息,请告诉我。