我一直沒能找到除了任何參考:是否可以將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