1

我在下面编写了一个简单的程序,它从网络摄像头获取视频流并将其显示在屏幕上。直到这里一切都好(当我移动相机时,一切都是同步的)。但我还想同时显示一个永久旋转的彩色三角形。问题是旋转很慢。问题来自于 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 之间存在同步问题,但我不确定。有人可以帮助我吗?

4

2 回答 2

0

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

于 2013-05-07T20:33:14.010 回答
0

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

像这样的东西:

static double lastTime = glfwGetTime();
double currentTime = glfwGetTime();
float deltaTime = float(currentTime - lastTime);
...
angle += deltaTime * speed;
...
lastTime = currentTime;
于 2016-07-05T21:48:35.787 回答