使用OpenCV和Python高效计算视频的总帧数
这篇博客将介绍两种使用OpenCV和Python计算视频文件中帧数的方法。
-
超级快,它依靠OpenCV的视频属性功能,能够(几乎)立即确定视频文件中的帧数。但是由于依赖(安装的OpenCV +视频编解码器版本),此方法很容易出错,甚至可能返回无意义的结果。
在这种情况下,需要使用第二种方法:手动计算视频中的帧总数。
-
手动计算视频中的帧数。尽管速度极慢,但此方法具有100%准确的优点。
计算可参考 imutils 库中的count_frames函数。该函数将首先尝试方法1,如果失败,将自动恢复为方法2。
使用过程中如果更偏向准确性,则使用方法2,如果偏向近似值和速度,则使用方法1;
1. 效果图
opencv自带的高效计数如图所示:
python count_frames.py --video videos/jurassic_park_trailer.mp4
[INFO] 4,790 total frames read from jurassic_park_trailer.mp4
低效的手动计数如图所示:
python frame_counter.py --video videos/jurassic_park_trailer.mp4 --override 1
[INFO] 4,978 total frames read from jurassic_park_trailer.mp4
为什么帧计数不一致?
一切都归结为快速和近似与缓慢但准确的关系。
- 使用OpenCV的视频捕获属性,可以非常快速地获得总帧数,但它可能不会100%有效。而且可能完全由于OpenCV /视频编解码器版本控制而使这种方法失败。
- 使用手动计算帧数,则将花费很长时间,但是返回的帧总数将是准确的。
如果需要绝对准确的计数,请使用方法2。
如果需要大致的近似值,请使用方法1(除非失败,否则无论如何您都将恢复为方法2)。
2. 源码
# USAGE
# time python frame_counter.py --video videos/example.mp4 --override 1
# time python frame_counter.py --video videos/example.mp4
# 导入必要的包
# 如果返回的总帧数为0,则99%是以下俩个原因,1)视频文件的路径不对;2)安装的视频编解码器不对,解决办法:安装合适的视频编解码器,并重新编译安装opencv;
from imutils.video import count_frames
import argparse
import os
# 构建命令行参数及解析
# -video 视频文件路径
# -override 是否使用手动计帧数
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", required=True,
help="path to input video file")
ap.add_argument("-o", "--override", type=int, default=-1,
help="whether to force manual frame count")
args = vars(ap.parse_args())
# 计算视频文件的总帧数
override = False if args["override"] < 0 else True
total = count_frames(args["video"], override=override)
# 展示帧总数在终端上
print("[INFO] {:,} total frames read from {}".format(total,
args["video"][args["video"].rfind(os.path.sep) + 1:]))