如何使用所需的fps在c ++中使用OpenCV捕获视频

时间:2014-12-18 15:04:17

标签: c++ opencv video frame-rate

我需要在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的集成摄像头

2 个答案:

答案 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,数字越大,在直播的情况下,跳过中间间隔的帧,所以只使用它,如果您认为,它会帮助您。