我需要用OpenCV每秒拍摄一帧。问题是VideoCapture::get(CV_CAP_PROP_FPS);总是返回0。如果我尝试使用VideoCapture::set设置所需的fps,则不会发生任何变化。
这是我的代码:
VideoCapture cap(0);
if (!cap.isOpened()) {
cout << "Cannot open the video cam" << endl;
return -1;
}
double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
double fps = 1;
cap.set(CV_CAP_PROP_FPS, fps);
cout << "FPS : " << fps << endl;
cout << "Frame size : " << dWidth << " x " << dHeight << endl;
namedWindow("CAPTURE EXPRESSION",CV_WINDOW_AUTOSIZE);
while (1) {
Mat frame;
bool bSuccess = cap.read(frame);
if (!bSuccess) {
cout << "Cannot read a frame from video stream" << endl;
break;
}
fps = cap.get(CV_CAP_PROP_FPS);
imshow("MyVideo", frame);
cout << "FPS : " << fps << endl;
if (waitKey(30) == 27) {
cout << "esc key is pressed by user" << endl;
break;
}
}
附言:我在Mac OS上使用OpenCV 2.4.9,并使用MacBook的集成摄像头
2条答案
按热度按时间nr9pn0ug1#
你不能为摄像头设置帧速率,因为当你的代码请求它们时,它们只是简单地通过管道输入。你可以在代码中设置一个延迟,每隔1秒请求一次,我认为这对你的用例很有帮助。
请参见下面的代码。
ozxc1zmp2#
这一套和得到的fps总是搞砸了,即使当我用来跟踪,他们是一种随机的,一个适当的解释,从某人将是一个有趣的事情阅读。它可能有一些依赖于视频容器。
但是,我不认为fps的设置参数适用于实时摄像头,这就像要求摄像头前的世界运行缓慢,这是不会发生的。另一种方法是将实时帧存储在缓冲区中,并根据您需要的速度显示。我不认为opencv会这样做。所以,如果您想要一个较慢的速度,录制视频,然后,设置fps,并检查录制的视频。
waitKey的数值较大,在实时流的情况下,会跳过间隔之间的帧,因此仅在您认为有帮助时使用它。