【问题标题】:OpenCV 3.x - Use already allocated buffer (with Cuda or OpenCL) for UMatOpenCV 3.x - 为 UMat 使用已分配的缓冲区(使用 Cuda 或 OpenCL)
【发布时间】:2017-08-27 23:43:39
【问题描述】:

我正在寻找一种方法来使用已分配的 GPU 缓冲区(来自 OpenCL、Cuda 或 OpenGL)的数据初始化 cv::Umat,而无需将数据复制回 CPU 端。

理想情况下,不涉及复制操作,UMat 将“环绕”GPU 上已经存在的数据(之前使用 CUDA/OpenCL/OpenGL 分配)。如果这不起作用,也可以将 GPU 上的 OpenCL/CUDA 缓冲区直接复制到 UMat 而不将数据传输回主机端(因为 GPU 设备上的复制操作比在CPU 端)。

OpenCV API 描述了如何获取现有 UMat 的数据的 OpenCL 句柄,但反之则不然。任何已经这样做或知道如何完成它的人?谢谢!

【问题讨论】:

  • Michael -> 你为什么拒绝我的问题?

标签: mapping gpu opencv3.0


【解决方案1】:

我也在寻找相同的答案,我有一些可行的方法,但是将它们全部设置起来可能会很有挑战性...... 来自(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()

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 2015-11-12
    • 2013-07-27
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多