在以前的OpenCV版本中,我可以使用OpenGL渲染到后备缓冲区,使用
现在我可以只使用OpenGL和OpenCL来做类似的事情,通过使用
然而,这迫使我编写自己的OpenCL内核(没人有时间去做那个...实际上,在Nvidia上调试OpenCL非常困难),用于任何我想要执行的处理。现在,由于OpenCV具有一些出色的OpenCL加速流程,我想尝试一下它们。
所以我的问题是:是否可能将渲染结果绑定在帧缓冲区(或GPU上的另一个GL上下文),并将其控制权(或副本)交给OpenCV上下文(umat?)以进行OpenCL加速处理?如果可以,那么如何实现(大致思路、关键组件)?
我感觉可以使用
glReadPixels
将像素“复制”到OpenCV图像(iplimage?)中进行一些处理(模糊、与另一种由OpenCV加载的图像进行模板匹配)。 但是,这会在GPU和CPU之间转移数据,如果我想显示它,则需要再次将数据从CPU传输回GPU。现在我可以只使用OpenGL和OpenCL来做类似的事情,通过使用
clEnqueueAcquireGLObjects
,我根本不必转移数据。我使用OpenGL渲染到帧缓冲区,并让OpenCL控制它。然而,这迫使我编写自己的OpenCL内核(没人有时间去做那个...实际上,在Nvidia上调试OpenCL非常困难),用于任何我想要执行的处理。现在,由于OpenCV具有一些出色的OpenCL加速流程,我想尝试一下它们。
所以我的问题是:是否可能将渲染结果绑定在帧缓冲区(或GPU上的另一个GL上下文),并将其控制权(或副本)交给OpenCV上下文(umat?)以进行OpenCL加速处理?如果可以,那么如何实现(大致思路、关键组件)?
我感觉可以使用
cv :: ogl :: Buffer
将缓冲区包装起来,但是文档不是很清楚,然后使用ogl :: Buffer::copyTo
进行复制。类似问题:是否可能将OpenCV GpuMat绑定为OpenGL纹理?
其他参考资料:从Mat / oclMat传输数据到cl_mem(OpenCV + OpenCL)。