我需要在OpenCV中获得第二帧。 问题是VideoCapture :: get(CV_CAP_PROP_FPS);总是返回0。 如果我尝试使用VideoCapture设置所需的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;
}
}
P.S。我正在使用OpenCV 2.4.9和Mac OS,以及MacBook的集成摄像头
答案 0 :(得分:2)
您无法为相机Feed设置帧速率,因为它们只是在代码请求时通过管道输入。你可以在你的代码中加一个延迟,只能每1秒请求一次,我觉得这对你的用例很有帮助。
见下面的代码。
VideoCapture上限(0);
while(1){
Mat frame; bool bSuccess = cap.read(frame); imshow("MyVideo", frame); //This Sets the Frame Rate to 1000ms (1s) cv::waitKey(1000);
}
答案 1 :(得分:1)
这个fps的设置和获取总是搞砸了,即使我曾经追踪过,它们也是随机的,一个人的正确解释是一个有趣的东西。它可能对视频容器有一些依赖性。
但是,我不认为fps的设置参数适用于实时摄像头,就像要求网络摄像头前的世界运行缓慢,这不会发生。另一种方法是将实时帧存储在缓冲区中并按照您所需的速度显示。我不认为opencv会这样做。因此,如果您想要较慢的速率,请录制视频,然后设置fps并检查录制的视频。
waitKey,数字越大,在直播的情况下,跳过中间间隔的帧,所以只使用它,如果您认为,它会帮助您。