2013-08-06 35 views
8

I nie były w stanie znaleźć żadnego odniesienia za wyjątkiem:Czy można powiązać OpenCV GpuMat jako teksturę OpenGL?

http://answers.opencv.org/question/9512/how-to-bind-gpumat-to-texture/

który omawia podejście CUDA.

Idealnie chciałbym zaktualizować tekst OpenGL z zawartością cv::gpu::GpuMat bez kopiowania z powrotem do procesora i bez bezpośredniego użycia CUDA (chociaż zakładam, że to może być konieczne, dopóki ta funkcja nie zostanie dodana).

Odpowiedz

11

OpenCV ma obsługę OpenGL. Zobacz plik nagłówkowy opencv2/core/opengl_interop.hpp. Można skopiować zawartość GpuMat do Tekstura:

cv::gpu::GpuMat d_mat(768, 1024, CV_8UC3); 
cv::ogl::Texture2D tex; 
tex.copyFrom(d_mat); 
tex.bind(); 
// draw something 

Można również użyć cv::ogl::Buffer klasę. Jest to opakowanie dla pamięci bufora OpenGL. Pamięć ta może być odwzorowany w pamięci CUDA bez kopii pamięci:

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

Więc tutaj jest mój zrozumienie, może nie w 100% poprawne, i przepraszam za mój brak matki-lang-angielskim.

GpuMat używa Globalna pamięć. Jednak tekstury OpenGL znajdują się w pamięci tekstur, która jest specjalnie zaprojektowana dla procesorów graficznych GPU (nie rdzeni CUDA). Tekstura memów nie jest uporządkowana jak zwykle liniowe tablice 2D/3D, może użyć pewnej wartości Space Filling Curve, aby uporządkować swoją zawartość, aby zoptymalizować prędkość pamięci podręcznej tekstury. W ten sposób nie można uzyskać wskaźnika urządzenia do tekstury. Możesz uzyskać dostęp do Texture Mem bezpośrednio w CUDA poprzez Texture Fetch (tylko do odczytu) lub Surface R/W.

Obecna implementacja OpenCV wydaje się nie używać funkcji cuda/powierzchni. Musisz skopiować teksturę z pamięci globalnej, aby powiązać je jako GpuMat s. Cóż, nie jest to rozwiązanie "wiążące".

This thread opisuje pisanie podejścia CUDA do tekstur OpenGL.

Albo czekać na OpenCV do wdrożenia nowej funkcji, lub czekać nową architekturę GPU NVIDIA ujednolicenie Texture Mem oraz globalny Mem, czy czekać ktoś wynalazł specjalne urządzenie EMP włamać te wspomnienia ... XD