2013-12-18 149 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失敗