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