2013-08-06 36 views
8

私はを除いて、すべての参照を見つけることができませんでした:CUDAのアプローチを説明しOpenCV GpuMatをOpenGLテクスチャとしてバインドすることはできますか?

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

を。

理想的には、OpenGLテクスチャをcv::gpu::GpuMatの内容で更新したいのですが、CUDAを直接使用することなく(この機能が追加されるまでは必要かもしれませんが)、CPUにコピーする必要はありません。

答えて

11

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(...); 
4

さて、ここで多分100%正確ではない、私の理解だし、私の非母のlang-英語をお詫び申し上げます。

GpuMatは、グローバルメモリを使用します。しかし、OpenGLテクスチャはテクスチャメモリにあります。これはGPUのテクスチャハードウェア(CUDAコアではない)用に特別に設計されています。テクスチャmemは、通常の線形2D/3D配列として編成されていません。テクスチャキャッシュレートを最適化するためにコンテンツを整理するには、特定のSpace Filling Curveを使用することがあります。したがって、Textureへのデバイスポインタを取得することはできません。テクスチャフェッチ(読み込み専用)またはサーフェスR/W経由でCUDAで直接テクスチャメモリにアクセスできます。

現在のOpenCV実装では、cudaテクスチャ/サーフェスフィーチャを使用していないようです。テクスチャからグローバルメモリにコピーして、GpuMatとバインドする必要があります。まあ、かなり "バインド"ソリューションではありません。

This threadには、OpenGLテクスチャに書き込むCUDAアプローチが記載されています。

どちらのOpenCVのは、新しい機能を実装する、またはテクスチャMemのグローバルMemのを統合NVIDIAの新GPUアーキテクチャを待つ、または誰かがこれらのメモリをハックするために、特別なEMPデバイスを発明待つのを待つ... XD

関連する問題