OpenCV的3.X - 为UMAT
问题描述:
使用已分配的缓冲区(使用CUDA或者OpenCL的)
我一直在寻找一种方式,而不必初始化一个已分配GPU缓冲区的数据(从OpenCL的,Cuda的或OpenGL)一cv::Umat
将数据复制回CPU端。OpenCV的3.X - 为UMAT
理想的情况下,没有复制操作是参与和UMAT将“包装”围绕在GPU(这是以前使用CUDA/OpenCL的/ OpenGL的分配)已经存在的数据。如果不工作,也可以接受的在OpenCL/CUDA缓冲器直接在GPU上复制到一个UMat
而不转化中的数据返回到主机侧(因为GPU设备上的拷贝操作被比CPU上快得多侧)。
OpenCV API描述了如何获得OpenCL对现有UMat
的数据的处理,但不是相反。如果谁已经这样做或有一个想法如何把它做?谢谢!
答
我也在寻找相同的答案,我有一些可能的工作,但是他们设置了所有可能具有挑战性... 从(opencl-opencv-interop.cpp):
// 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;
}
您应该能够转换为CL buffer from GL,或者直接使用CL缓冲区,然后使用上面的函数或convertFromBuffer()
。
迈克尔 - >你为什么要否决我的问题? – Martin1988a