繁体   English   中英

OpenCV:无法通过视频获得帧率

[英]OpenCV: cant get framerate from video

我想获得视频的帧率,但我总是在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上运行良好。

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

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

测试:

  • Ubuntu 15.04 64bit
  • 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)之后进行计算,因为抓取第一帧和一些初始化可能会弄乱该计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM