我在mac osx 10.9中使用了一个简单的c ++程序,使用的是opencv 2.4.8,它是在QT支持和OPENGL支持的情况下编译的。这是我用于构建opencv 2.4.8
的cmake配置的相关部分GUI:
-- QT 4.x: YES (ver 4.8.6 EDITION = OpenSource)
-- QT OpenGL support: YES (/usr/local/Cellar/qt/4.8.5/lib/QtOpenGL.framework)
-- OpenGL support: YES (/System/Library/Frameworks/AGL.framework /System/Library/Frameworks/OpenGL.framework)
这是一个简单的GUI程序,
int main( int argc, char *argv[] ) { namedWindow("my-win", WINDOW_OPENGL);
int desiredWindowWidth = 800, desiredWindowHeight =600;
resizeWindow("my-win", desiredWindowWidth, desiredWindowHeight);
cv::VideoCapture capture(0);
for(;;) {
Mat view;
if( capture.isOpened() )
{
capture >> view;
}
imshow("my-win", view);
char key = (char)waitKey(30);
if( key == 's') {
unsigned char* pixels = new unsigned char [ 3 * desiredWindowWidth * desiredWindowHeight];
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glReadPixels(0, 0, desiredWindowWidth, desiredWindowHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels);
Mat savedImage(desiredWindowHeight, desiredWindowWidth, CV_8UC3, pixels);
cv::flip(savedImage, savedImage, 0);
imwrite("./foo.jpg", savedImage);
}
}
}
结果:我得到一个窗口,当前摄像机图像作为输出。到现在为止还挺好。 但是我得到的窗口比我要求的窗口(800 x 600)可能是400 x 300窗口要小。此外,如果我给出任何其他比例窗口大小参数(例如:1200 x 900),我仍然得到相同大小的窗口。看起来“resizeWindow”运行不正常。
无法检查所创建窗口的大小。我做的是将窗口保存为图像,我得到一个黑色的800 x 600图像,窗口内容出现在一个角落,作为400x300的一部分。
答案 0 :(得分:0)
事实证明,我确实使用了openGL 2.1,如下面的glxinfo输出所示。
glxinfo | grep OpenGL
OpenGL vendor string: Intel Inc.
OpenGL renderer string: Intel Iris Pro OpenGL Engine
OpenGL version string: 2.1 INTEL-8.20.26
OpenGL shading language version string: 1.20
OpenGL extensions:
我通过包含glew和gflw3重写了我的应用程序并强制使用了3.2版本的OpenGL。 现在我可以控制窗口的大小。
int main(int argc, char **argv) {
GLFWwindow* window;
const GLubyte * strGLVersion;
if (!glfwInit())
exit(EXIT_FAILURE);
//ask for OpenGL 3.2
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
window = glfwCreateWindow(800, 600, "check-opengl", NULL, NULL);
if (!window) {
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
//more accommodating glew
glewExperimental = true;
if(glewInit() != GLEW_OK) {
glfwTerminate();
exit(EXIT_FAILURE);
}
//v-sync off
glfwSwapInterval(0);
//print version
strGLVersion = glGetString(GL_VERSION);
cout << "GL_VERSION:" << strGLVersion << endl;
const GLubyte * strGLShadingLanguageVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
cout << "GL_VERSION:" << strGLShadingLanguageVersion << endl;
VideoCapture cap(0);
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat image;
cap >> image;
const string win_name("kgeorge-ar");
while (!glfwWindowShouldClose(window)) {
cap >> image;
//-----------8<------ snip -------8<------------
//code for converting image to opengl texture
//and rendering it to a quad is omited
//-----------8<------ snip -------8<------------
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
exit(EXIT_SUCCESS);
return 0;
}