OpenCV设置相机帧率无效。

3

我现在正在进行实时面部评估,并尝试将计算机相机的FPS设置为每秒1帧,然后每秒只调用一次级联函数。(目前使用While(true)循环)这是由于我的GPU的限制。

我已经尝试使用以下方法来设置相机的FPS:

VideoCapture cap(0); 
cap.set(CV_CAP_PROP_FPS, 1);
namedWindow("webcam",CV_WINDOW_AUTOSIZE);

但是它没有起作用。相机仍以相对较高的FPS进行处理。

对于级联函数调用,我是按以下方式执行的:

while ( true ){

        cap >> frame;
        vector<Rect> faces;
        face_cascade.detectMultiScale( frame, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

        // Draw circles on the detected faces
        for( int i = 0; i < faces.size(); i++ )
        {
            Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
            cout<<"Face location: "<<faces[i].x<<","<<faces[i].x + faces[i].width<<","<<faces[i].y<<","<<faces[i].y + faces[i].height;
            ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
        }

        waitKey(30);  
       if ( !frame.data ){ 
            cerr << "Cannot acquire frame from the webcam " << endl;
            break;
       } 
       imshow("webcam", frame); 
    }

我需要相机每秒只拍摄一帧,随后每秒调用级联函数。

编辑:我尝试使用以下方式显示相机的帧率:

        int FPS = cap.get(CV_CAP_PROP_FPS);

显示FPS当前为1,但相机仍以相对较高的帧率移动。

1个回答

0

设置帧率并不总是有效。有时相机根本不会对此更改做出响应。但是,您可以通过一种巧妙的方式解决问题。测量处理一帧所需的时间,然后从1000毫秒(1000-Elapsce_Time)中减去它,并使其等待这段时间cv :: waitKey(1000-Elapsce_Time)。最后,这不是一个很好的解决方法。您应该寻找相机的实际问题并尝试解决它。


谢谢!WaitKey 对我有用!我尝试了另一种方法,通过在循环中调用 C++ 的 "Sleep" 函数,这也可以工作,但我认为它不是真正有效的。我无法确定相机的问题(很可能是由于我的电脑)。 - Piiinkyy
cv::waitKey必须正常工作,否则你的代码存在问题或者与OpenCV链接有误,或者其他我不知道的问题。 - Humam Helfawi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接