使用OpenCV和Python高效计算视频的总帧数

使用OpenCV和Python高效计算视频的总帧数

这篇博客将介绍两种使用OpenCV和Python计算视频文件中帧数的方法。

  1. 超级快,它依靠OpenCV的视频属性功能,能够(几乎)立即确定视频文件中的帧数。但是由于依赖(安装的OpenCV +视频编解码器版本),此方法很容易出错,甚至可能返回无意义的结果。

    在这种情况下,需要使用第二种方法:手动计算视频中的帧总数。

  2. 手动计算视频中的帧数。尽管速度极慢,但此方法具有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:]))

参考

上一篇:FFmpeg笔记(四)


下一篇:使用 Pillow 快速创建 GIF 动图