我一直没能找到除了任何参考:是否可以将OpenCV GpuMat作为OpenGL纹理进行绑定?
http://answers.opencv.org/question/9512/how-to-bind-gpumat-to-texture/
。它讨论了CUDA的方法。
理想情况下,我想更新一个OpenGL纹理与cv::gpu::GpuMat
的内容而不复制回CPU,并且没有直接使用CUDA(虽然我认为这可能是必要的,直到此功能被添加)。
我一直没能找到除了任何参考:是否可以将OpenCV GpuMat作为OpenGL纹理进行绑定?
http://answers.opencv.org/question/9512/how-to-bind-gpumat-to-texture/
。它讨论了CUDA的方法。
理想情况下,我想更新一个OpenGL纹理与cv::gpu::GpuMat
的内容而不复制回CPU,并且没有直接使用CUDA(虽然我认为这可能是必要的,直到此功能被添加)。
OpenCV支持OpenGL。请参阅opencv2/core/opengl_interop.hpp
头文件。您可以GpuMat的内容复制到纹理:
cv::gpu::GpuMat d_mat(768, 1024, CV_8UC3);
cv::ogl::Texture2D tex;
tex.copyFrom(d_mat);
tex.bind();
// draw something
您还可以使用cv::ogl::Buffer
类。它是OpenGL缓冲存储器的包装。该内存可以被映射到CUDA内存无记忆副本:
cv::ogl::Buffer ogl_buf(1, 1000, CV_32FC3);
cv::gpu::GpuMat d_mat = ogl_buf.mapDevice();
// fill d_mat with CUDA
ogl_buf.unmapDevice();
// use ogl_buf in OpenGL
ogl_buf.bind(cv::ogl::Buffer::ARRAY_BUFFER);
glDrawArray(...);
那么这里是我的理解,也许不是100%正确的,我非的母亲琅英语道歉。
GpuMat
使用全局内存。然而,OpenGL纹理位于纹理内存,它是专为GPU的纹理硬件(而不是CUDA内核)设计的。纹理存储不像通常的线性2D/3D阵列那样组织,它可以使用特定的Space Filling Curve来组织其内容以优化纹理缓存速率。因此你不能得到一个指向纹理的设备指针。您只能通过Texture Fetch(只读)或Surface R/W在CUDA中直接访问纹理内存。
目前的OpenCV实现似乎不使用cuda纹理/表面特征。您必须从纹理复制到全局内存以将它们绑定为GpuMat
s。那么,不是一个“绑定”解决方案。
This thread描述了一种写入OpenGL纹理的CUDA方法。
要么等待OpenCV实现新功能,要么等待NVIDIA新的GPU架构统一纹理内存和全局内存,或者等待某人发明特殊的EMP设备来破解这些内存...... XD