4

OpenCV でマーカーを検出し、OpenGL で画像をオーバーレイしたい。最初の部分は問題ありません (検出マーカーを完全に達成しています) が、2 番目の部分には問題があります。

マーカーは次のとおりです。

ここに画像の説明を入力

画像は次のとおりです。

ここに画像の説明を入力

しかし、結果は次のとおりです。

ここに画像の説明を入力

画像のテクスチャを生成するコードは次のとおりです。

GLuint *textures = new GLuint[2];
glGenTextures(2, textures);
Mat image = imread("Immagine.png");
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);

そして、私が使用するテクスチャを表示するには:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, WIDTH, HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, textures[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)(coord[1].x),(GLfloat)(coord[1].y));
glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)(coord[2].x),(GLfloat)(coord[2].y));
glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)(coord[3].x),(GLfloat)(coord[3].y));
glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)(coord[0].x),(GLfloat)(coord[0].y)); 
glEnd();

テクスチャ付きの画像がなぜそれほど奇妙であるかはわかりません。また、同じコードを使用して (opengl ウィンドウで) Web カメラからキャプチャされたフレームを表示しますが、問題はありません。また、コーナーに数字のない同じ画像を使用すると、正しく機能することにも注意しました(同じ場所/マーカーの座標になくても)。

誰にもアイデアはありますか?

4

1 に答える 1

5

これはパディング/アラインメントの問題です。

GL とは異なるパディング要件を持つフォーマットをロードしています (デフォルトでは、ピクセルの行が 4 バイトの倍数にパディングされることが想定されています)。

これに対する可能な修正は次のとおりです。

  • (たとえば)を使用して、テクスチャがどのようにパックされているかをGLに伝えますglPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • パディングが何も変更せずに一致するように、テクスチャの寸法を変更します
  • パディングがGLが期待するものと一致するように、テクスチャの読み込みを変更します
于 2013-02-08T17:32:12.227 に答える