2013-12-18 153 views
4

我想获得视频的帧率,但我总是在Linux上获得-nan。OpenCV:无法从视频获取帧率

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上工作正常。

+0

这与OpenCV的2.4.7为我工作在Linux上我如何获得帧率。你安装了哪个Ffmpeg版本?尝试编译最新版本。 – Eric

+0

我有同样的问题,我已经安装了所有软件包的最后一个版本,但在unix whixh上返回'nan'在Mac上正常工作。 –

+0

当我将其更新到2.4.8时出现同样的问题。当它是2.4.5时它工作正常。 – takfuruya

回答

1

我的猜测是它取决于相机。一些(API)功能有时不能在OpenCV中实现和/或您的相机支持。如果你检查github上的代码,最好的办法是。

关于你的问题:我可以通过一个普通的网络摄像头和一个XIMEA摄像头来获得帧率。

测试上:

  • 的Ubuntu 15.04 64位
  • 使用Qt和XIMEA摄像头支持编译OpenCV的3.0.0

你可以衡量你的帧率自己:

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

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

0

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

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

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

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失败