resizeWindow不适用于osx 10.9中的opencv 2.4.8

时间:2014-02-17 12:07:49

标签: c++ qt opengl opencv user-interface

我在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的一部分。

1 个答案:

答案 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;
    }