2

OpenCV ウェブカメラ キャプチャを取得して 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 WebカメラのキャプチャをOpenGLコンテキストに取得するための最速の方法に関するアイデア。見たものすべてをテストし、結果を投稿します。

4

1 に答える 1

4

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

次に、おそらく最も速いのは、openGLピクセルバッファを使用することです。申し訳ありませんが、コードはQtからのものであるため、関数名は少し異なりますが、シーケンスは同じです。

openglテクスチャを割り当てます

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);       

次に、メモリを使用するためのテクスチャへのポインタを取得します

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

次に、それを描画します-上記のマップされた呼び出しでデータがGPUにコピーされたため、これは本質的に瞬時に行われる必要があります

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

glFormatとglFormatExtに異なるタイプを使用することにより、グラフィックカードをハードウェアでopencVsBGRと一般的なRGBA表示形式の間で自動的に変換することができます。

于 2012-05-10T18:49:58.893 に答える