OpenCV:VideoCapture :: get(CV_CAP_PROP_FPS)返回0 FPS

swt*_*rgn 11 c++ windows camera opencv avi

我试图从我的相机获取fps,以便我可以将其传递给VideoWriter输出视频.但是,我通过VideoCapture::get(CV_CAP_PROP_FPS)相机调用获得0 fps .如果我硬编码,我的视频可能太慢或太快.

#include "opencv2/opencv.hpp"
#include <stdio.h>
#include <stdlib.h>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    cv::VideoCapture cap;
    int key = 0;

    if(argc > 1){
        cap.open(string(argv[1]));
    }
    else
    {
        cap.open(CV_CAP_ANY);
    }
    if(!cap.isOpened())
    {
        printf("Error: could not load a camera or video.\n");
    }

    Mat frame;
    cap >> frame;
    waitKey(5);

    namedWindow("video", 1);
    double fps = cap.get(CV_CAP_PROP_FPS);
    CvSize size = cvSize((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),(int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));

    int codec = CV_FOURCC('M', 'J', 'P', 'G');
    if(!codec){ waitKey(0); return 0; }
    std::cout << "CODEC: " << codec << std::endl;
    std::cout << "FPS: " << fps << std::endl;
    VideoWriter v("Hello.avi",-1,fps,size);
    while(key != 'q'){
        cap >> frame;
        if(!frame.data)
        {
            printf("Error: no frame data.\n");
            break;
        }
        if(frame.empty()){ break; }
        v << frame;
        imshow("video", frame);
        key = waitKey(5);
    }
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

如何才能VideoCapture::get(CV_CAP_PROP_FPS)返回正确的fps或VideoWriter为所有网络摄像头提供通用的fps ?

lit*_*imp 4

据我所知,CV_CAP_PROP_FPS 仅适用于视频。如果您想从网络摄像头捕获视频数据,您必须自己正确计时。例如,使用计时器每 40 毫秒从网络摄像头捕获一帧,然后保存为 25 fps 视频。

  • 网络摄像头使用固定或定义的帧速率进行捕获。对于给定的分辨率,捕获将以 15 fps、25 fps、60 fps 的速度进行...这取决于网络摄像头的速度、链接带宽、驱动程序和设置。如果网络摄像头的帧速率与您捕获的帧不匹配,有时您可能会捕获同一帧两次,有时您可能会跳帧,因此运动将不流畅。 (3认同)
  • 获得平滑运动的方法是设置所需的 FPS(如果驱动程序允许,请参阅我在 http://stackoverflow.com/a/22920585/1816603 中的回复)并以网络摄像头提供的帧速率进行捕获,(或它的分隔符,例如 60 -&gt; 30、50 -&gt; 25、30 -&gt; 15)。 (2认同)