我希望获得视频的帧率,但我总是在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上运行良好。
答案 0 :(得分:1)
我的猜测是它依赖于相机。某些(API)功能有时未在OpenCV中实现和/或您的相机支持。如果你检查github上的代码,那将是最好的。
关于您的问题:我可以使用普通网络摄像头和XIMEA相机获取您的代码的帧速率。
经过测试:
您可以自己测量帧速率:
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)之后进行计算,因为抓取第一帧和一些初始化可能会使计算混乱。