2013-08-06 67 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