Mapping OpenCV 3.x-将已经分配的缓冲区(与Cuda或OpenCL一起)用于UMat
我在寻找一种方法,用已经分配的GPU缓冲区(来自OpenCL、Cuda或OpenGL)的数据初始化Mapping OpenCV 3.x-将已经分配的缓冲区(与Cuda或OpenCL一起)用于UMat,mapping,gpu,opencv3.0,Mapping,Gpu,Opencv3.0,我在寻找一种方法,用已经分配的GPU缓冲区(来自OpenCL、Cuda或OpenGL)的数据初始化cv::Umat,而不必将数据复制回CPU端 理想情况下,不涉及复制操作,UMat将“包装”GPU上已经存在的数据(以前使用CUDA/OpenCL/OpenGL分配)。如果不起作用,也可以将GPU上的OpenCL/CUDA缓冲区直接复制到UMat,而不将数据传输回主机端(因为GPU设备上的复制操作比CPU端快得多) OpenCV API描述了如何获取现有UMat数据的OpenCL句柄,但不是相反。有
cv::Umat
,而不必将数据复制回CPU端
理想情况下,不涉及复制操作,UMat将“包装”GPU上已经存在的数据(以前使用CUDA/OpenCL/OpenGL分配)。如果不起作用,也可以将GPU上的OpenCL/CUDA缓冲区直接复制到UMat
,而不将数据传输回主机端(因为GPU设备上的复制操作比CPU端快得多)
OpenCV API描述了如何获取现有
UMat
数据的OpenCL句柄,但不是相反。有谁已经做过这件事或者知道怎么做吗?谢谢 我也在寻找同样的答案,我有一些可能有效的方法,但是设置它们可能会很有挑战性。。。
From():
您应该能够转换为,或者直接使用CL缓冲区,然后使用上面的函数或
convertFromBuffer()
Michael->为什么您投票否决了我的问题?
// this function is an example of interoperability between OpenCL buffer
// and OpenCV UMat objects. It converts (without copying data) OpenCL buffer
// to OpenCV UMat and then do blur on these data
int App::process_cl_buffer_with_opencv(cl_mem buffer, size_t step, int rows, int cols, int type, cv::UMat& u)
{
cv::ocl::convertFromBuffer(buffer, step, rows, cols, type, u);
// process right half of frame in OpenCV
cv::Point pt(u.cols / 2, 0);
cv::Size sz(u.cols / 2, u.rows);
cv::Rect roi(pt, sz);
cv::UMat uroi(u, roi);
cv::blur(uroi, uroi, cv::Size(7, 7), cv::Point(-3, -3));
if (buffer)
clReleaseMemObject(buffer);
m_mem_obj = 0;
return 0;
}