OpenCV:无法从视频中获取帧速率

时间:2013-12-18 17:07:09

标签: c++ opencv

我希望获得视频的帧率,但我总是在Linux上获得-nan。

VideoCapture video(input);
if (!video.isOpened())  // zakoncz program w przypadku, problemu z otwarciem
{
    exit(0);
}

double fps = video.get(CV_CAP_PROP_FPS);

我的openCv版本是2.4.7。相同的代码在Windows上运行良好。

3 个答案:

答案 0 :(得分:1)

我的猜测是它依赖于相机。某些(API)功能有时未在OpenCV中实现和/或您的相机支持。如果你检查github上的代码,那将是最好的。

关于您的问题:我可以使用普通网络摄像头和XIMEA相机获取您的代码的帧速率。

经过测试:

  • Ubuntu 15.04 64bit
  • 使用Qt和XIMEA相机支持编译的OpenCV 3.0.0

您可以自己测量帧速率:

double t1 = (double)cv::getTickCount();
// do something
t1 = ((double)cv::getTickCount() - t1)/cv::getTickFrequency();

为您提供//do something花费的时间。

答案 1 :(得分:1)

来自文件,您可以尝试自己估算。

VideoCapture video("name_of_video.format");
int frameCount = (int)video.get(CV_CAP_PROP_FRAME_COUNT) ;
//some times frame count is wrong, so you can verify
video.set(CV_CAP_PROP_POS_FRAMES , frameCount-1);

//try to read the last frame, if not decrement frame count
    while(!(video.read(nextFrame))){

    frameCount--;

    video.set(CV_CAP_PROP_POS_FRAMES , frameCount-1);
}

//it is already set above, but just for clarity
      video.set(CV_CAP_PROP_POS_FRAMES , frameCount-1);
      double fps = (double)(1000*frameCount)/( video.get(CV_CAP_PROP_POS_MSEC));
      cout << "fps: " << fps << endl;

这是我在使用CV_CAP_PROP_FPS失败时获得帧率的方法

答案 2 :(得分:0)

这个问题并不能说明这是指来自实时来源(网络摄像头)还是来自视频文件的视频。

如果是后者,OpenCV的功能将取决于文件中使用的格式和编解码器。对于某些文件格式,期望获得0或NaN。

如果是前者,则可能不会返回源的实际fps,尤其是如果硬件不支持所请求的帧速率,而是使用不同的帧速率。对于这种情况,我建议采用类似于@ holzkohlengrill的方法,但只能在初始延迟300ms(YMMV)之后进行计算,因为抓取第一帧和一些初始化可能会使计算混乱。