glReadPixels第二次读取失败



以下代码运行良好

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);在RenderObject()上。

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

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

我想您的第一个示例运行良好,因为您两次都在imshow中显示out1。否则,在函数中,你会破坏窗口,然后在下一个函数调用中再次使用它,有问题吗?

EDIT:显示窗口不会获得图像的所有权(当然也不会获得GL帧缓冲区的所有权,为什么以及应该如何获得),但销毁CV窗口(使用destroyWindow),然后再次使用此窗口(在下一个函数调用的imshow中)肯定不是一个好主意。我认为imshow并不是每次被调用时都会创建一个新窗口,它使用了你用namedWindow创建的窗口,在第二次函数调用中,这个窗口已经不存在了,因为你用destroyWindow破坏了它。

当使用"WITH_QT_OPENGL"构建OpenCV时,会出现上述问题。

解决方案:

  1. 构建不带"WITH_QT_OPENGL"选项的OpenCV。它将完全删除所有错误
  2. 或者解决方法-重新附加绘制缓冲区(即glDrawBuffer仅与默认缓冲区对象或帧缓冲区对象(FBO)同时与FBO和纹理/渲染缓冲区,您可以使用"glCheckFramebufferStatusEXT(GL_framebuffer_EXT);"使其有效)

相关内容

  • 没有找到相关文章

最新更新