2012-04-25 6 views
2

私は数日、OpenCVのウェブカメラのキャプチャを取ってOpenGLのコンテキストで表示する方法を探していました。これまでのところ、ズームが必要になるまで、これは正常に機能するようです。最も速いOpenCV 2 OpenGLのコンテキスト

void Camera::DrawIplImage1(IplImage *image, int x, int y, GLfloat xZoom, GLfloat yZoom) 
{ 
    GLenum format; 
     switch(image->nChannels) { 
      case 1: 
       format = GL_LUMINANCE; 
       break; 
      case 2: 
       format = GL_LUMINANCE_ALPHA; 
       break; 
      case 3: 
       format = GL_BGR; 
       break; 
      default: 
       return; 
     } 

    yZoom =- yZoom; 
     glRasterPos2i(x, y); 
     glPixelZoom(xZoom, yZoom); //Slow when not (1.0f, 1.0f); 
     glDrawPixels(image->width, image->height, format, GL_UNSIGNED_BYTE, image->imageData); 
} 

私は、おそらくFBOのアプローチをとる方がより速いと聞いています。 OpenCVウェブカムをOpenGLのコンテキストにキャプチャする最速の方法について、そこにあるアイデア。私は私が見るすべてをテストし、結果を投稿します。

+2

'glDrawPixels()'は間違いなく良い方法です。 [this](http://www.songho.ca/opengl/gl_pbo.html#unpack)のようなものが良いかもしれません。 – Flexo

+0

今日私は4つの異なる方法を試みました。あなたが2のべき乗の比率を必要とし、サブテクスチャがそれを遅くするので、テクスチャはうまくいきません。ミップマップや他のミップマップにgluを使用すると、速度が遅くなります。 glip APIを使用するのは、ミップマップだけが機能するため遅いです。これまでに試した最速の例は上記のものです。 – aquawicket

+0

'glTexImage2D()'、そして '' glBegin(GL_QUADS) 'を使ってNPOTテクスチャにデータをアップロードする方法はありますか?(http://stackoverflow.com/a/4854802/176769)? – karlphillip

答えて

3

OpenGLの実装に^ 2テクスチャが必要ですか?非常に貧弱なPC実装(はいIntel)でも、現在任意のサイズを管理できます。

その後最速の関数名は若干異なりますが、順序は同じ

glEnable(GL_TEXTURE_2D); 
glGenTextures(1,&texture); 

glBindTexture(GL_TEXTURE_2D,texture);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);   
glTexImage2D(GL_TEXTURE_2D, 0, glFormat, width, height, 0, glFormatExt, glType, NULL); 

glDisable(GL_TEXTURE_2D);  
OpenGLのテクスチャを割り当ててあるので、OpenGLのピクセルバッファ 申し訳ありませんが、コードは、Qtのからである使用することはおそらくあり

は今、それを描くのに続いてmemeory

glbuffer.bind(); 
unsigned char *dest = (unsigned char*)glbuffer.map(QGLBuffer::ReadWrite); 
// creates an openCV image but the pixel data is stored in an opengl buffer 
cv::Mat opencvImage(rows,cols,CV_TYPE,dest); 
.... do stuff .... 
glbuffer.unmap(); // pointer is no longer valid - so neither is openCV image 

を使用するテクスチャへのポインタを取得する - これは、基本的にインスタントBでなければなりませんデータは自動的にハードウェアであなたのためにopencVs BGRと、典型的なRGBAディスプレイフォーマット間の変換のグラフィックスカードを持つことができglFormatとglFormatExtのためのさまざまな種類を使用することにより

glBindTexture(GL_TEXTURE_2D,texture);      
glTexSubImage2D(GL_TEXTURE_2D, 0, 0,0, width, height, glFormatExt, glType, 0);                     
glbuffer.release(); 

上記マッピングされた呼び出しでGPUにコピーされたecause。

+0

もっと詳しく教えていただけますか?私はあなたが "glbuffer.bind()"でどのバッファをバインドしているのか分かりません。あなたはFBOを指していますか?私はFBOでbind()メソッドを使用することはできません...私はあなたの答えに非常に興味があります、私はここで同様のものを尋ねましたhttp://gamedev.stackexchange.com/questions/30606/opengl-fbo-to-opencv- image – Dan

+1

QGLBuffer http://qt-project.org/doc/qt-4.8/qglbuffer.html PBOまたはVBOのラッパーです。したがって、glbuffer.bindはglBindBufferARBと同等です。http://www.songho.ca/opengl/gl_pbo.htmlを参照してください。 –