2017-08-27 117 views
0
使用已分配的缓冲区(使用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的数据的处理,但不是相反。如果谁已经这样做或有一个想法如何把它做?谢谢!

+0

迈克尔 - >你为什么要否决我的问题? – Martin1988a

回答

0

我也在寻找相同的答案,我有一些可能的工作,但是他们设置了所有可能具有挑战性... 从(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()