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

OpenCV: cant get framerate from video

本文关键字:获取 帧速率 视频 OpenCV      更新时间:2023-10-16

我想获得视频的帧率,但我总是在 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。相同的代码在窗口上工作正常。

我的猜测是它依赖于相机。某些(API)函数有时未在OpenCV中实现和/或不受相机支持。最好是检查 github 上的代码。

关于您的问题:我能够使用普通网络摄像头和带有您的代码的 XIMEA 摄像头获得帧速率。

测试于:

  • 乌班图 15.04 64位
  • OpenCV 3.0.0 编译,支持 Qt 和 XIMEA 相机

您可以自己测量帧速率:

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

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

它来自一个文件,你可以尝试自己估计它。

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

该问题没有阐明这是指来自实时源(网络摄像头)还是来自视频文件的视频。

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

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