Ich konnte keine Referenz finden außer:
diskutiert einen CUDA-Ansatz.
Idealerweise möchte ich eine OpenGL-Textur mit dem Inhalt von cv::gpu::GpuMat
aktualisieren, ohne sie in die CPU zu kopieren und ohne CUDA direkt zu verwenden (obwohl ich vermute, dass dies notwendig ist, bis diese Funktion hinzugefügt wird).
OpenCV hat OpenGL-Unterstützung. Siehe opencv2/core/opengl_interop.hpp
Header-Datei. Sie können den Inhalt von GpuMat in Textur kopieren:
Sie können auch cv::ogl::Buffer
class verwenden. Es ist ein Wrapper für OpenGL-Pufferspeicher. Dieser Speicher kann CUDA-Speicher ohne Speicherkopie zugeordnet werden:
Nun, hier ist mein Verständnis, vielleicht nicht 100% korrekt, und entschuldige mich für mein Nicht-Mutter-Lang-Englisch.
GpuMat
verwendet Globaler Speicher . OpenGL-Texturen befinden sich jedoch im 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, sondern können bestimmte Space Filling Curve verwenden, um den Inhalt zu organisieren um die Textur-Cache-Rate zu optimieren. Daher können Sie keinen Gerätezeiger auf Texture legen. Sie können Textur-Mem nur direkt in CUDA über Texture Fetch (Read Only) oder Surface R / W aufrufen.
Die aktuelle OpenCV-Implementierung scheint keine Cuda-Textur / Oberflächenfunktion zu verwenden. Sie müssen aus Texturen in den globalen Speicher kopieren, um sie als GpuMat
s zu binden. Nun, nicht ganz eine "bind" Lösung.
Dieser Thread beschreibt einen CUDA-Ansatz, der in OpenGL-Texturen schreibt.
Warten Sie entweder auf OpenCV, um die neue Funktion zu implementieren, oder warten Sie NVIDIAs neue GPU-Architektur, die Texture Mem und Global Mem vereint, oder warten Sie jemanden, der ein spezielles EMP-Gerät erfindet, um diese Erinnerungen zu hacken ... XD