这是非常简单的代码..唯一的事情是我多次重复相同的代码进行详细调试。详细信息: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(即无错误)。我用framebuffer对象以及默认的glut隐藏窗口测试了代码。另外,让我告诉您,我必须使用framebuffer对象。因此,不能使用相同的默认窗口进行绘制和显示。
最佳答案
code4为0,因为在上一个glGetError()之后没有新的OpenGL操作发生。您应该解决启动时出现的问题,这是glGetError()第一次出现非零返回值的情况。因此,待办事项列表上的第一件事是在下面添加glGetError()glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
那条线应该不会真正造成任何麻烦,但还是要检查一下。如果不是,那么namedWindow调用可能会使事情变得混乱。您的OpenGL上下文是哪个版本?
关于opengl - OpenCV 2.2窗口在OpenGL上引起问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386591/