OpenGL渲染到Framebuffer,传输到OpenCV Umat进行OpenCL加速处理



在旧版本的OpenCV中,我可以使用OpenGL来渲染backbuffer,使用glreadpixels将像素"复制"到OpenCV图像(iplimage?)进行一些处理(模糊,与另一个OpenCV加载的图像进行模板匹配)。然而,这将花费我从GPU转移到CPU,然后如果我想要显示它,回到GPU。

现在我可以用OpenGL和OpenCL做类似的事情,通过使用clEnqueueAcquireGLObjects,我根本不需要转移。我OpenGL渲染到一个Framebuffer,让OpenCL控制它。

然而,这迫使我编写自己的OpenCL内核(没有人有时间…实际上在Nvidia上调试OpenCL非常困难),无论我想做什么处理。现在OpenCV有一些很棒的opencl加速进程,我想尝试一下。

所以我的问题:是否有可能渲染到Framebuffer(或GPU上的另一个GL上下文),给予控制(或复制)到OpenCV上下文(umat?)用于opencl加速处理?如果有,如何(大局,关键组件)?

我有一种感觉,我可以使用cv::ogl::Buffer来包装缓冲区,但文档对此并不完全清楚,然后使用ogl::Buffer::copyTo复制它。类似:是否有可能将OpenCV GpuMat绑定为OpenGL纹理?

other ref: Transfer data from Mat/oclMat to cl_mem (OpenCV + OpenCL)

是的,可能是现在。我编写了演示OpenGL/OpenCL/VAAPI互操作的演示。tetrai -demo使用OpenGL呈现一个旋转的四面体,将framebuffer(实际上是一个附加到framebuffer的纹理)传递到OpenCV/CL(作为cv::UMat)并将其编码为VP9。都在GPU上。唯一的问题是,所需的修复存在于我的OpenCV 4中。X叉,你必须自己构建它。它还需要两个OpenCL扩展:cl_khr_gl_sharing和cl_intel_va_api_media_sharing

有两个公开的github问题解决我的努力:

  • OpenGL/OpenCL与VAAPI/OpenCL同时互操作
  • 使用VAAPI硬件加速从V4l2捕获MJPEG到使用VAAPI/OpenCL互操作的OpenCL

相关内容

  • 没有找到相关文章

最新更新