我正在C++中运行一个OpenCV程序,该程序读取摄像头图像,然后执行一些操作。如果我让它以最快速度运行,相机将以15 FPS的速度运行。我正在尝试使用相机来调节FPS到我选择的数量,如10 FPS。我正在使用计时器来完成此操作(timepec对象和clock_gettime()函数调用)。自行运行的时钟工作正常,摄像头本身运行良好,但是当我尝试每隔100 ms自行抓取一帧时,程序将运行大约3秒钟,然后完全冻结。这是我的代码中的while循环:OpenCV程序在执行几秒钟后死机
/* Start the timer */
clock_gettime(CLOCK_REALTIME, &ts);
startBit = ts.tv_nsec;
/* Show the image captured from the camera in the window and repeat */
while (1) { // main while loop
clock_gettime(CLOCK_REALTIME, &ts);
endBit = ts.tv_nsec;
if (endBit-startBit >= 100000000) { // > 100 ms
fprintf(stderr, "%lu\n", endBit-startBit);
clock_gettime(CLOCK_REALTIME, &ts);
startBit = ts.tv_nsec; // reset timer
IplImage* frame = cvQueryFrame(capture); // Get one frame
Mat limage(frame); // convert IplImage to Mat
if (!frame) {
fprintf(stderr, "ERROR: frame is null...\n");
getchar();
break;
}
cvWaitKey(90);
}
}
该程序将打印到控制台的时间已经过去。它现在设置的方式应该始终打印接近100毫秒(100000000纳秒)的数据。但是控制台每秒钟给出一个奇怪的数字:18446744072800674356.正如我前面提到的,注释掉相机图像代码,计时器可以自行工作(它仍然会打印出那么大的数字,但它会永远运行)。如果我注释掉计时器代码,摄像机将以15 FPS运行,没有问题。但是,当我将代码一起运行时,约3秒后会冻结。任何帮助表示赞赏!
请问,如果你把'cvWaitKey(90),它的工作'权的if语句之外? (请参阅http://opencv.willowgarage.com/wiki/documentation/c/highgui/WaitKey) – 2013-03-12 17:44:55
不,它的行为与if语句内部或外部的cvWaitKey()相同。 – keithbhunter 2013-03-12 19:28:34