3. 视频帧保存为图像
任务目标
从输入视频中按固定帧间隔抽取帧,并将抽取的帧保存为JPEG图像文件。本案例使用OpenCV的VideoCapture读取视频,通过帧计数判断是否到达保存间隔,最终将符合条件的帧写入指定输出目录。
环境依赖
- Python 3.7+
- OpenCV:
pip install opencv-python
完整实现
import cv2
import os
def extract_frames(video_path, output_dir, interval=30):
"""
从视频中按指定帧间隔保存JPEG图像
Args:
video_path: 输入视频文件路径
output_dir: 输出图像目录
interval: 帧间隔,每interval帧保存一帧
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 打开视频
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
raise IOError(f"无法打开视频文件: {video_path}")
frame_count = 0
saved_count = 0
while True:
ret, frame = cap.read()
if not ret:
break
# 每interval帧保存一次
if frame_count % interval == 0:
out_path = os.path.join(output_dir, f"frame_{saved_count:04d}.jpg")
cv2.imwrite(out_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 95])
saved_count += 1
frame_count += 1
cap.release()
print(f"处理完成: 共读取 {frame_count} 帧, 保存 {saved_count} 张图像到 {output_dir}")
if __name__ == "__main__":
# 使用示例
extract_frames("input_video.mp4", "output_frames", interval=30)
运行方式
- 将上述代码保存为
extract_frames.py。 - 将待处理的视频文件命名为
input_video.mp4并放在同一目录下(或修改代码中的路径)。 - 执行命令:
python extract_frames.py
验证方法
- 程序运行结束后,检查当前目录下是否生成了
output_frames文件夹。 - 打开该文件夹,确认其中包含按
frame_0000.jpg、frame_0001.jpg顺序编号的JPEG图像文件。 - 若视频总帧数为N,且间隔为30,则保存的图像数量约为
N/30 + 1张(首帧始终保存)。 - 用图片查看器打开任意一张图像,确认画面内容与视频对应时间点的画面一致,且文件可正常打开(非空文件)。
关键说明
interval=30表示每30帧保存一帧,即若视频帧率为30fps,则每秒保存1张图像。可根据需要调整该参数。- JPEG质量参数设为95,可在文件大小与画质间取得平衡;如需调整,修改
cv2.IMWRITE_JPEG_QUALITY后的数值(范围0~100)。 - 若视频编码格式特殊导致无法打开,请确认OpenCV版本支持该格式,或先使用格式转换工具预处理视频。