【问题标题】:The cvQueryFrame function call slows the main loop execution using OpenCV and OpenGLcvQueryFrame 函数调用会减慢使用 OpenCV 和 OpenGL 的主循环执行速度
【发布时间】:2013-05-05 19:53:18
【问题描述】:

我在下面编写了一个简单的程序,它从网络摄像头获取视频流并将其显示在屏幕上。直到这里一切都好(当我移动相机时,一切都是同步的)。但我还想同时显示一个永久旋转的彩色三角形。问题是旋转很慢。问题来自于 cvQueryFrame 调用(如果我删除了 cvQueryFrame 调用,当然我的窗口上没有视频,但三角形可以正确旋转)。我知道这个函数会进行一些堆分配,而堆分配在主循环中非常糟糕。但另一方面,我必须在每次循环出现时获取下一帧。启动应用程序时,如果我移动相机,图像会与我的动作同步,但模型的旋转速度很慢。所以这似乎不是帧率问题(在我看来,如果是这样的话,视频不应该与我的动作同步)。

这是我的 C++ 代码:

#define GL_WINDOW_WIDTH 500
#define GL_WINDOW_HEIGHT 500

float angle = 0.0f;

int             main(void)
{
    if (!glfwInit())
        return (-1);

    //Window initialization

    if (!glfwOpenWindow(GL_WINDOW_WIDTH, GL_WINDOW_HEIGHT, 8, 8, 8, 8, 0, 0, GLFW_WINDOW)) {
        glfwTerminate();
        return (-1);
    }

    //Projection

    glViewport(0,0, GL_WINDOW_WIDTH, GL_WINDOW_HEIGHT) ;
    glEnable(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, 500.0f / 500.0f, 0.1f, 100.0f);
    gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    CvCapture   *capture = cvCaptureFromCAM(CV_CAP_ANY);
    IplImage    *frame = NULL;

    glMatrixMode(GL_PROJECTION) ;
    glLoadIdentity();

    gluPerspective(45.0f, GL_WINDOW_WIDTH / GL_WINDOW_HEIGHT, 0.1f, 100.0f);
    gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    //Main loop

    while (1)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;

        //Get next video frame

        frame = cvQueryFrame(capture);

        //Draw video frame

        glDrawPixels(frame->width, frame->height, GL_RGB, GL_UNSIGNED_BYTE, frame->imageData);

        //Triangle transformations

        glMatrixMode(GL_MODELVIEW) ;
        glLoadIdentity() ;

        glPushMatrix();
        glRotatef(angle, 1.0f, 1.0f, 1.0f);

        //Render triangle

        glBegin(GL_TRIANGLES);
        glColor3ub(255, 0, 0);
        glVertex3f(-1.0f, 0.0f, 0.0f);
        glColor3ub(0, 255, 0);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glColor3ub(0, 0, 255);
        glVertex3f(1.0f, 0.0f, 0.0f);
        glEnd();

        glPopMatrix();

        glfwSwapBuffers();

        angle++;

        if ( (cvWaitKey(10) & 255) == 27 ) break;
    }
    cvReleaseImage(&frame);
    cvReleaseCapture(&capture);
    cvDestroyWindow("mywindow");

    return (EXIT_SUCCESS);
}

所以我认为 OpenCV 和 OpenGL 之间存在同步问题,但我不确定。有谁能帮帮我吗?

【问题讨论】:

    标签: opengl opencv opengl-3


    【解决方案1】:

    我找到了问题的根源。我拥有一台 15 FPS 的罗技 C210。 cvQueryFrame 函数在每次调用时“等待”下一帧,因此对于每次循环迭代。因此,与没有调用 cvQueryFrame 的程序执行相比(大约 120 FPS),我的三角形旋转缓慢是正常的。所以我的解决方案是购买一个新的网络摄像头,提供更好的 FPS 速率(例如,60 FPS 应该更好!)。我希望这个回复对某人有所帮助。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,你可以做的是让旋转独立于 FPS。

      类似这样的:

      static double lastTime = glfwGetTime();
      double currentTime = glfwGetTime();
      float deltaTime = float(currentTime - lastTime);
      ...
      angle += deltaTime * speed;
      ...
      lastTime = currentTime;
      

      【讨论】:

        猜你喜欢
        • 2019-02-20
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多