OpenCV 2.2 窗口导致 OpenGL 出现问题
Posted
技术标签:
【中文标题】OpenCV 2.2 窗口导致 OpenGL 出现问题【英文标题】:OpenCV 2.2 window causes problem on OpenGL 【发布时间】:2011-06-17 13:38:58 【问题描述】:这是非常简单的代码.. 唯一的问题是我多次重复相同的代码以进行详细调试。详细信息:OpenGL 版本 3.3.0,Window 7 OS 和 VS2008,OpenCV 2.2.0。
RenderObject();
//glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
Mat image;
image.create(screenHeight,screenWidth, CV_8UC3);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)image.data);
int error_code1 = glGetError(); // Error Code: 0, NO Error, Also output is good/as expected!
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
int error_code8 = glGetError(); // Error Code: 0, NO Error
//flip(image, image, 0);
//glPopClientAttrib();
const char *title = "glReadPixels Output";
cv::namedWindow(title);
int error_code2 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION
imshow(title, image);
int error_code3 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION
waitKey(5000);
int error_code4 = glGetError(); // Error Code: 0, NO Error
destroyWindow(title);
int error_code5 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION
image.release();
int error_code6 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
int error_code7 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION
这里发生了一些事情。那是什么? ...好吧,即使 OpenCV 窗口正在接管默认缓冲区,至少 error_code7 应该为 0(即没有错误)。我用帧缓冲对象和默认的 glut 隐藏窗口测试了代码。还让我告诉你,我必须使用帧缓冲区对象来达到我的目的。所以,不能使用相同的默认窗口来绘制和显示。
【问题讨论】:
【参考方案1】:code4 为 0,因为在之前的 glGetError() 之后没有发生新的 OpenGL 操作。您应该在问题开始时解决问题,即 glGetError() 的非零返回值第一次出现。因此,待办事项列表上的第一件事是在下面添加一个 glGetError()
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
那条线应该不会真的造成任何麻烦,但还是要检查一下。如果没有,那么可能是 namedWindow 调用搞砸了。您的 OpenGL 上下文是哪个版本?
【讨论】:
OpenGL 3.3.0 版,Window 7 OS 和 VS2008。我还在“glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);”之后检查了“glGetError()”,没有错误。我也相应地更新了问题。谢谢。 终于找到了问题的根源和一些解决方案。谢谢!【参考方案2】:使用“WITH_QT_OPENGL”构建 OpenCV 时,会出现上述问题。
解决方案:
-
构建不带“WITH_QT_OPENGL”选项的 OpenCV。它将完全消除所有错误。
或解决方法 - 重新附加绘图缓冲区(即 glDrawBuffer 仅与默认缓冲区对象或帧缓冲区对象 (FBO) 同时 FBO 和纹理/渲染缓冲区,您可以使用 'glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);' 来验证它)
【讨论】:
以上是关于OpenCV 2.2 窗口导致 OpenGL 出现问题的主要内容,如果未能解决你的问题,请参考以下文章