2013-08-06 24 views
8

Ich habe nicht in der Lage gewesen, eine Referenz zu finden ausgenommen:Ist es möglich OpenCV GpuMat als OpenGL Textur zu binden?

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

, die einen CUDA Ansatz diskutiert.

Idealerweise möchte ich eine OpenGL-Textur mit dem Inhalt einer cv::gpu::GpuMat aktualisieren, ohne zurück in die CPU zu kopieren und ohne CUDA direkt zu verwenden (obwohl ich vermute, dass dies notwendig sein kann, bis diese Funktion hinzugefügt wird).

Antwort

11

OpenCV unterstützt OpenGL. Siehe opencv2/core/opengl_interop.hpp Header-Datei. Sie können den Inhalt von GpuMat zu Texture kopieren:

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

Sie auch cv::ogl::Buffer Klasse verwenden können. Es ist ein Wrapper für OpenGL-Pufferspeicher. Dieser Speicher kann ohne Speicherkopie auf CUDA-Speicher zugeordnet werden:

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

Nun, hier ist mein Verständnis, vielleicht nicht 100% richtig, und entschuldige mich für meine Nicht-Mutter-lang-Englisch.

GpuMat verwendet Global Memory. OpenGL-Texturen befinden sich jedoch in Texturspeicher, der speziell für die Textur-Hardware der GPU (nicht für CUDA-Kerne) entwickelt wurde. Textur mem sind nicht wie üblich lineare 2D/3D-Arrays organisiert, es kann bestimmte Space Filling Curve verwenden, um seinen Inhalt zu organisieren, um die Textur-Cache-Rate zu optimieren. Daher können Sie keinen Gerätezeiger auf Texture legen. Sie können Texture Mem direkt in CUDA über Texture Fetch (Read Only) oder Surface R/W erreichen.

Aktuelle OpenCV-Implementierung scheinen nicht Cuda Textur/Oberfläche Feature zu verwenden. Sie müssen von Texturen in den globalen Speicher kopieren, um sie als GpuMat s zu binden. Nun, nicht ganz "bind" -Lösung.

This thread beschreibt eine CUDA-Methode zum Schreiben in OpenGL-Texturen.

Entweder warten OpenCV die neue Funktion zu implementieren, oder warten NVIDIAs neue GPU-Architektur Texture Mem und Global Mem Vereinheitlichung, oder warten Sie jemand ein spezielles EMP-Gerät erfinden, diese Erinnerungen zu hacken ... XD