在Ubuntu 12.10上使用OpenCV 2.4.3.2与PS3-Eye相机我无法捕获每秒超过~60帧 (FPS)。相机本身提供高达125 FPS。我想知道是什么限制了OpenCV的帧率。下面是我目前所做的:
#include <sys/time.h>
#include <time.h>
#include <iostream> // for standard I/O
using cv;
using std;
long time_diff( const timespec &t1, const timespec &t2 ) {
return (long)(t2.tv_sec-t1.tv_sec)*1000000000 + (t2.tv_nsec-t1.tv_nsec);
}
int main(int argc, char *argv[]) {
VideoCapture cap(0); // open the default camera
cap.set(CV_CAP_PROP_EXPOSURE, 0);
cap.set(CV_CAP_PROP_FPS, 125);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
timespec t_start, t_end;
for(int i=1;;++i) {
cap >> frame;
clock_gettime(CLOCK_REALTIME, &t_end);
if( i%20==0 )
std::cout << "FPS ~= " << time_diff(t_start, t_end) << std::endl;
clock_gettime(CLOCK_REALTIME, &t_start);
}
}
每20帧输出帧率到标准输出。请注意,我必须修补源,以便能够为PS3-Eye相机设置正确的帧率。
首先,我将帧率设置为30 (cap.set(CV_CAP_PROP_FPS, 30);
)以验证我的测量是正确的。然后使用更高的帧率,报告的帧率上限为~60 FPS。
USB不是问题,因为我可以用guvcview
获得完整的120 FPS。
我将上面的代码修改为使用grab()
和retrieve()
,如下所示:
clock_gettime(ClOCK_REALTIME, &t_start);
cap->grab();
clock_gettime(ClOCK_REALTIME, &t_end);
cap->retrieve(frame);
,但是帧率是,上限是~60 FPS。
那么我怎么知道是什么限制了帧率呢?
从笔记本电脑切换到台式机后,我能够捕捉到完整的帧率。似乎opencv的捕获实现不如guvcview中高效。
我有同样的问题65 FPS限制在win7 x64与OpenCV和Delphi X6。发现的问题是在cvWaitKey或/和Windows消息队列中,它限制了65 Hz的重绘。解决方案-减少调用cvWaitKey的频率,每秒少于65次