如何在C++中使用OpenCV以所需的fps捕捉视频

5jdjgkvh  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(310)

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

nr9pn0ug

nr9pn0ug1#

你不能为摄像头设置帧速率,因为当你的代码请求它们时,它们只是简单地通过管道输入。你可以在代码中设置一个延迟,每隔1秒请求一次,我认为这对你的用例很有帮助。
请参见下面的代码。

VideoCapture cap(0);

while (1) {
    Mat frame;
    bool bSuccess = cap.read(frame);
    
    imshow("MyVideo", frame); 
    //This Sets the Frame Rate to 1000ms (1s)
    cv::waitKey(1000);
}
ozxc1zmp

ozxc1zmp2#

这一套和得到的fps总是搞砸了,即使当我用来跟踪,他们是一种随机的,一个适当的解释,从某人将是一个有趣的事情阅读。它可能有一些依赖于视频容器。
但是,我不认为fps的设置参数适用于实时摄像头,这就像要求摄像头前的世界运行缓慢,这是不会发生的。另一种方法是将实时帧存储在缓冲区中,并根据您需要的速度显示。我不认为opencv会这样做。所以,如果您想要一个较慢的速度,录制视频,然后,设置fps,并检查录制的视频。
waitKey的数值较大,在实时流的情况下,会跳过间隔之间的帧,因此仅在您认为有帮助时使用它。

相关问题