1

次のコードは正常に動作します

const char *title = "glReadOutput";
Mat out1, out2;

out1.create(screenHeight,screenWidth, CV_8UC3);
out2.create(screenHeight,screenWidth, CV_8UC3);

RenderObject();
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)out1.data);
//flip(out1, out1, 0);
imshow(title, out1);
waitKey(5000);

RenderObject();
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)out2.data);
//flip(image, out2, 0);
imshow(title, out2);
waitKey(5000);

ただし、glReadPixels を関数に転送すると、最初の呼び出しでは正常に動作しますが、2 回目の呼び出しでは何も失敗/読み取りません:(

RenderObject();
displayImage(out1);

RenderObject();
displayImage(out2);
.
.

void displayImage(Mat& image) {

  //glReadBuffer(GL_FRONT);
  //glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);

  glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)image.data);

  //flip(image, image, 0);
  //glPopClientAttrib();

  const char *title = "glReadPixels";
  imshow(title, image);
  waitKey(5000);
  destroyWindow(title);
  //image.release();
}

数点:糸も同じです。バッファは 1 つしかありません。フレームバッファ オブジェクト (FBO) と glut ウィンドウで同じ動作をします。glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS) も試してみましたが、コードがコメントされていることがわかりました。glClear(GL_COLOR_BUFFER_BIT); も呼び出しました。RenderObject() で。

どこが間違っている可能性がありますか?

編集:クリスチャン..ありがとう!あなたは正しいです。しかし、なぜそれが起こっているのか。image.data にバッファのリンクがありませんか? 読み終わった後?それとも...表示ウィンドウがglバッファの所有権を引き継いでおり、それを破棄している間に何か問題が発生していますか?

4

2 に答える 2

1

out1あなたの最初の例はうまくいくと思いますimshow。それ以外の場合、関数内でウィンドウを破棄してから、次の関数呼び出しで再度使用します。問題はありませんか?

編集:表示ウィンドウは画像の所有権を取得しません (GL フレーム バッファーの所有権も取得しません)。ただし、CV ウィンドウを破棄し (をdestroyWindow使用)、このウィンドウを再度使用します (imshow次の関数呼び出し) は確かに良い考えではありません。imshow呼び出されるたびに新しいウィンドウを作成しないと思います.で作成したウィンドウを使用namedWindowし、2番目の関数呼び出しでは、で破棄したため、このウィンドウはもう存在しませんdestroyWindow.

于 2011-06-16T22:21:25.277 に答える
0

「WITH_QT_OPENGL」を使用して OpenCV をビルドすると、上記の問題が発生します。

ソリューション:

  1. 「WITH_QT_OPENGL」オプションなしで OpenCV をビルドします。すべてのエラーを完全に削除します。
  2. または、回避するには、描画バッファーを再アタッチします (つまり、glDrawBuffer をデフォルト バッファー オブジェクトのみ、またはフレームバッファー オブジェクト (FBO) と FBO とテクスチャ/レンダー バッファーの両方で使用します。「glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);」を使用してこれを有効にすることができます)。
于 2011-06-17T20:32:27.927 に答える