5

私の作品では、キャプチャしたフレームの一部を画像に重ねています。openCV でウェブカメラを開き、キャプチャしたフレームをテクスチャに変換して GLUT ウィンドウに表示します。また、このテクスチャの一部をこの画像に重ねます。

ここに画像の説明を入力

これをリアルタイムで実行すると、結果は次のようになります。

ここに画像の説明を入力

ご覧のとおり、投影された画像のエッジは不正確です。エイリアシングの問題だと思いますが、openglでアンチエイリアシング処理を行う方法がわかりません。Web で検索しようとしましたが、問題の適切な解決策が見つかりませんでした。

「計算」関数では、次のコードを使用してマット イメージをテクスチャに変換します。

GLvoid calculate(){
...
...
cvtColor(image, image, CV_BGR2RGB);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glBindTexture(GL_TEXTURE_2D, textures[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    //glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.cols, image.rows, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}

このコードを使用して結果を表示します。

GLvoid Show(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Matrice di proiezione
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, WIDTH, HEIGHT, 0); 

    // Matrice model view
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 
...
...
glBindTexture(GL_TEXTURE_2D, textures[1]);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((coord[3].x)),(GLfloat)(coord[3].y));
        glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((coord[0].x)),(GLfloat)(coord[0].y));
        glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((coord[1].x)),(GLfloat)(coord[1].y));
        glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((coord[2].x)),(GLfloat)(coord[2].y)); 

        glEnd();    
    }
    glFlush();
    glutSwapBuffers();

}

初期化関数では、これを書きます:

GLvoid Init() {  

    glGenTextures(2, textures);
    glClearColor (0.0, 0.0, 0.0, 0.0);

    glEnable (GL_POLYGON_SMOOTH);
    glHint (GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
    glDisable(GL_DEPTH_TEST);

}

しかし、うまくいきません...

私は、OPenGL 4.0 と Glut 3.7 を使用して、Win7 x64 で作業しています。ビデオ カードは NVidia GeForce gt 630 です。また、Nvidia コントロール パネルからアンチエイリアシングを有効にしましたが、何も変わりません。誰かが私を助ける方法を知っていますか?

4

2 に答える 2

2

最初に、なぜ OpenGL 4.0 を使用して固定 (非推奨) パイプラインを使用しているのだろうかと思います... しかし、問題に取り掛かりましょう。必要なのはMSAAです。よくわかりませんが、コントロール パネルから有効にすると常にうまくいきます。通常はコード内で行われます。残念ながら、ハードウェアの MSAA レベルを設定するオプションのない GLUT を使用することを選択しました。そうしたい場合は、GLFWに切り替えます。別のオプションは手動で行うことですが、それはカスタム FBO を使用することを意味します。シナリオでは、テクスチャの MSAA レベルを設定する MSAA テクスチャ アタッチメントを使用して FBO を作成できます (必要に応じて、フラグメント シェーダーでカスタム マルチサンプリング アルゴリズムを適用することもできます)。 ここにこのトピックに関するスレッドがあります。

GLFW では、ウィンドウのセットアップで MSAA レベルを指定できます。関連する API を参照してください。

MSAA はパフォーマンスを低下させますが、その程度はハードウェアとおそらく OpenGL ドライバーに依存します。

于 2013-04-02T13:59:58.917 に答える