在旧版本的OpenCV中,我可以使用OpenGL渲染到后台缓冲区,使用glreadpixels
将像素“复制”到OpenCV图像(iplImage?)用于某些处理(模糊处理、与另一个加载了OpenCV的图像进行模板匹配)。然而,这将花费我从GPU到CPU的传输,然后如果我想要显示它,则返回到GPU。
现在,我只需要使用clEnqueueAcquireGLObjects
就可以用OpenGL和OpenCL做一些类似的事情,而且我根本不需要传输。我将OpenGL渲染到一个帧缓冲区,并让OpenCL控制它。
然而,这迫使我为我想做的任何处理编写自己的OpenCL内核(没有人有时间去做……实际上在Nvidia上调试OpenCL是非常困难的)。既然OpenCV有一些很棒的OpenCL加速进程,我想试一试。
所以我的问题是:是否有可能渲染到FrameBuffer(或GPU上的另一个GL上下文),将控制权(或复制)交给OpenCV上下文(umat?)用于OpenCL加速处理?如果是这样的话,如何(大局、关键组成部分)?
我有一种感觉,我可以使用cv::ogl::Buffer
Package 缓冲区,但文档对此并不是很清楚,然后使用ogl::Buffer::copyTo
复制它。相似:Is it possible to bind a OpenCV GpuMat as an OpenGL texture?
其他参考文献:Transfer data from Mat/oclMat to cl_mem (OpenCV + OpenCL)
1条答案
按热度按时间k4aesqcs1#
是的,这是可能的--现在。我编写了演示OpenGL/OpenCL/VAAPI互操作的demos。tetra-demo使用OpenGL渲染旋转四面体,将帧缓冲区(实际上是附加到帧缓冲区的纹理)传递到OpenCV/CL(作为cv::UMAT)并将其编码为VP9。全部安装在图形处理器上。唯一的问题是,所需的修复程序驻留在我的OpenCV 4.x fork中,您必须自己构建它。它还需要两个OpenCL扩展:CL_khr_gl_Sharing和CL_intel_va_api_media_Sharing
GitHub有两个悬而未决的问题来解决我的努力: