在旧版本的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