[英]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摄像头获取帧速率。
测试:
您可以自己测量帧速率:
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.