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 转移到函数时,它在第一次调用时工作正常,但在第二次调用时失败/读取任何内容:(

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

几点:线程也一样。只有一个缓冲区。与帧缓冲区对象 (FBO) 以及过剩窗口的行为相同。我也试过 glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS),你可以看到代码被注释了。我也叫 glClear(GL_COLOR_BUFFER_BIT); 在渲染对象()上。

你能帮我吗,哪里可能出错?

编辑:克里斯蒂安..谢谢!你是对的。但是为什么会这样。image.data 上没有带缓冲区的链接,对吗?读完之后?还是...显示窗口接管了 gl 缓冲区的所有权,而我们破坏它时发生了什么问题?

4

2 回答 2

1

我猜你的第一个例子工作正常,因为你两次都显示out1imshow. 否则,在函数中销毁窗口,然后在下一个函数调用中再次使用它,有问题吗?

编辑:显示窗口不拥有图像的所有权(当然也不是你的 GL 帧缓冲区,为什么以及如何应该),而是破坏一个 CV 窗口(用destroyWindow)然后再次使用这个窗口(imshow在下一个函数调用)肯定不是一个好主意。我认为imshow每次调用它时都不会创建一个新窗口,它使用你创建的一个窗口,namedWindow并且在第二个函数调用中这个窗口不再存在,因为你用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 回答