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。相同的代码在窗口上工作正常。
我的猜测是它依赖于相机。某些(API)函数有时未在OpenCV中实现和/或不受相机支持。最好是检查 github 上的代码。
关于您的问题:我能够使用普通网络摄像头和带有您的代码的 XIMEA 摄像头获得帧速率。
测试于:
- 乌班图 15.04 64位
- 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) 后进行计算,因为抓取第一帧和发生的一些初始化可能会扰乱该计算。
相关文章:
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 如何在IQualProp::get_AvgFrameRate中重置帧速率?
- 如何在不同的线程中保持一定的帧速率
- 根据帧速率缩放/缩小数字
- 检查HTML 5视频元素是否正在获取帧
- 将Kinect v2帧速率(rgb、深度、骨架)设置为每秒25帧
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- OMNET++:如何在INET 4.0中获取帧的源MAC地址?
- 直接显示返回错误的帧速率 FPS
- SDL 帧速率上限实施
- 如何正确使用 libvlc (C++) 从 h264 视频流中获取帧
- 如何在Qt框架中从视频中逐个获取帧
- 在 OpenGL 中,在保持良好帧速率的同时,VBO 中有多少个顶点的好目标是什么
- 视频流控制帧速率x264
- 使用C (Linux)更改BlueFox3相机的流帧速率
- OpenCV:无法从视频中获取帧速率
- C++ 获取支持的相机分辨率和帧速率 OSX
- OpenCV (C++) 无法获取 XVID 视频文件帧速率