2013-08-06 65 views

回答

11

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(...); 
4

那么这里是我的理解,也许不是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