python使用OpenCV 库将视频拆解为帧并保存为图片
import cv2
import os
def video_to_frames(video_path, output_folder, frame_prefix='frame_', interval=1,
target_size=None, grayscale=False):
"""
将视频拆分为帧并保存为图片
参数:
video_path (str): 视频文件路径
output_folder (str): 输出图片的文件夹路径
frame_prefix (str): 保存帧图片的前缀(默认: frame_)
interval (int): 抽帧间隔(默认: 1,即所有帧)
target_size (tuple): 目标尺寸 (宽, 高),None表示保持原尺寸(默认)
grayscale (bool): 是否转换为灰度图(默认: False)
"""
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 读取视频文件
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print("Error: 无法打开视频文件")
return
frame_count = 0
saved_count = 0
while True:
ret, frame = cap.read()
if not ret:
break # 视频读取结束
# 按间隔处理帧
if frame_count % interval == 0:
processed_frame = frame.copy()
# 调整尺寸
if target_size is not None:
processed_frame = cv2.resize(processed_frame, target_size)
# 转换为灰度图
if grayscale:
processed_frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2GRAY)
# 生成文件名
filename = f"{frame_prefix}{saved_count:04d}.jpg"
file_path = os.path.join(output_folder, filename)
# 保存图片
cv2.imwrite(file_path, processed_frame)
saved_count += 1
frame_count += 1
# 释放资源
cap.release()
print(f"处理完成,共保存 {saved_count} 帧图片")
print(f"视频总帧数: {frame_count}")
# 使用示例
if __name__ == "__main__":
video_path = r"E:\photo\video\1.mp4" # 替换为你的视频路径
output_folder = r"E:\photo\video\1" # 输出文件夹
# 示例1:提取所有帧(原始尺寸和颜色)
video_to_frames(video_path, output_folder)
# 示例2:调整尺寸为 640x480,保存为灰度图,每隔10帧保存一次
# video_to_frames(
# video_path,
# output_folder,
# interval=10,
# target_size=(640, 480),
# grayscale=True
# )
# 示例3:仅调整尺寸为 1280x720
# video_to_frames(
# video_path,
# output_folder,
# target_size=(1280, 720)
# )
target_size
: 接收元组格式(width, height)
grayscale
: 布尔值控制是否转为灰度图先执行尺寸调整(保留更多原始信息)后执行灰度转换(减少最后一步的计算量)