Bia*_*int 6 opengl opencv rendering gpu opencl
在OpenCV的旧版本中,我可以使用OpenGL渲染后备缓冲区,用于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纹理?
是的,有可能——现在。我编写了演示 OpenGL/OpenCL/VAAPI 互操作的演示。tetra-demo使用 OpenGL 渲染旋转四面体,将帧缓冲区(实际上是附加到帧缓冲区的纹理)传递到 OpenCV/CL(作为 cv::UMat)并将其编码为 VP9。一切都在 GPU 上。唯一的问题是,所需的修复位于我的OpenCV 4.x 分支中,您必须自己构建它。它还需要两个 OpenCL 扩展:cl_khr_gl_sharing 和 cl_intel_va_api_media_sharing
有两个开放的 github 问题解决了我的工作: