Mapping OpenCV 3.x-将已经分配的缓冲区(与Cuda或OpenCL一起)用于UMat

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句柄,但不是相反。有

我在寻找一种方法,用已经分配的GPU缓冲区(来自OpenCL、Cuda或OpenGL)的数据初始化
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;
}