2013-08-06 4 views
8

Non sono stato in grado di trovare alcun riferimento ad eccezione di:E 'possibile associare un OpenCV GpuMat come una texture OpenGL?

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

che discute un approccio CUDA.

Idealmente mi piacerebbe aggiornare una trama OpenGL con il contenuto di un cv::gpu::GpuMat senza copiare nuovamente alla CPU, e senza usare direttamente CUDA (anche se presumo che questo potrebbe essere necessario fino a quando questa funzione non viene aggiunta).

risposta

11

OpenCV ha il supporto OpenGL. Vedi il file di intestazione opencv2/core/opengl_interop.hpp. È possibile copiare il contenuto di GpuMat alla Struttura:

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

È inoltre possibile utilizzare cv::ogl::Buffer classe. È un wrapper per memoria buffer OpenGL. Questa memoria può essere mappato alla memoria CUDA senza copia della memoria:

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

Ebbene ecco la mia comprensione, forse corretto non al 100%, e ci scusiamo per il mio non-madre-lang-inglese.

GpuMat utilizza Global Memory. Tuttavia, le trame OpenGL risiedono nella memoria di trama , appositamente progettata per l'hardware di trama della GPU (non per i nuclei CUDA). Le texture mem non sono organizzate come normali array 2D/3D lineari, ma è possibile utilizzare determinati Space Filling Curve per organizzare il proprio contenuto in modo da ottimizzare la velocità della cache della trama. Pertanto non è possibile ottenere un puntatore del dispositivo su Texture. È possibile accedere a Texture Mem direttamente in CUDA tramite Texture Fetch (sola lettura) o Surface R/W.

L'implementazione di OpenCV presente non sembra utilizzare la feature di struttura/superficie di cuda. Devi copiare dalle trame alla memoria globale per legarli come GpuMat s. Beh, non proprio una soluzione "vincolante".

This thread descrive un approccio CUDA che scrive su trame OpenGL.

O aspettare che OpenCV per implementare la nuova funzione, oppure attendere la nuova architettura GPU NVIDIA unificare Texture Mem e Global Mem, o aspettare qualcuno inventare un dispositivo di EMP speciale per incidere questi ricordi ... XD