Окно OpenCV 2.2 вызывает проблемы в OpenGL - PullRequest
1 голос
/ 17 июня 2011

Вот очень простой код. Единственное, я много раз повторял один и тот же код для детальной отладки.Подробная информация: OpenGL версии 3.3.0, ОС Windows 7 и 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

Что-то происходит здесь, под капотом.Что это такое?... по крайней мере error_code7 должен быть равен 0 (т.е. без ошибок), даже если окно OpenCV принимает буфер по умолчанию.Я тестировал код с объектом фреймбуфера, а также со скрытым окном по умолчанию.Также позвольте мне сказать вам, что я должен использовать объект framebuffer для своих целей.Таким образом, нельзя рисовать и показывать одно и то же окно по умолчанию.

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Когда OpenCV был построен с использованием WITH_QT_OPENGL, возникают вышеуказанные проблемы.

Решения:

  1. Сборка OpenCV без опции 'WITH_QT_OPENGL'.Он полностью удалит все ошибки.
  2. Или для обхода - повторно присоедините буфер рисования (т.е. glDrawBuffer только с буферным объектом по умолчанию или с кадровым буфером (FBO), как FBO, так и буфером текстур / рендеринга, вы можете использоватьэто с помощью 'glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT);')
0 голосов
/ 17 июня 2011

code4 равно 0, потому что после предыдущего glGetError () не произошло никакой новой операции OpenGL.Вы должны решить проблему, если она начнется, что в первый раз возвращает ненулевое возвращаемое значение из glGetError ().Следовательно, первое, что нужно сделать в списке задач, это добавить glGetError () ниже glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

Эта строка не должна вызывать проблем, но все же проверьте ее.Если нет, то, вероятно, вызов namedWindow все портит.Какая версия вашего контекста OpenGL?

...