参考
在利用 python 中的 cv2 模块处理视频时,想着能不能控制视频的读取帧率,因为想做状态检测相关的工作,大概每秒抓取一帧就行了,而原视频的帧率在 9fps, 如果对所有的帧都进行处理,会造成冗余计算。在寻找计算办法的时候,看到了这篇文章,觉得很有启发:
帧率控制
二、代码
代码如下:
import cv2
videoCapture = cv2.VideoCapture("视频文件存放路径") # 读取视频文件
fps = videoCapture.get(cv2.CAP_PROP_FPS) # 计算视频的帧率
print("fps:", fps)
total = int(videoCapture.get(cv2.CAP_PROP_FRAME_COUNT)) # 计算视频的总帧长
print("[INFO] {} total frames in video".format(total))
success, img = videoCapture.read() # 按帧读取视频,成功为sucess返回True,为img返回三维矩阵
frame_count = 0
# 精华部分
# 当成功读取到一帧后
while success:
frame_count = frame_count + 1 # 已读取的帧数计算
# 例: 每秒一帧:
if frame_count % int(fps) == 0: # 当累计帧数为你想要的帧率的倍数时,再进行图片处理操作!
# 以下部分为对图片的处理计算操作:
................
................
................
videoWriter.write(img) # 将每秒1帧处理的图像保存
# 图片处理操作结束
# 注意缩进
# 读取下一帧,实现更替
success, img = videoCapture.read()
总结
主要思想就是控制对图片的处理操作,达到伪帧率的效果。利用 cv2.read()读取视频的每一帧,原本是每一帧都要处理,例如 9 帧 / s, 每秒就要处理九张图像。如果我们想每秒只处理三张图像,则可以在 frame_count % 3 == 0 时再对图片进行处理,就达到了 3帧 / s 的效果。