python使用OpenCV 库将视频拆解为帧并保存为图片

发布于:2025-05-14 ⋅ 阅读:(11) ⋅ 点赞:(0)

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: 布尔值控制是否转为灰度图

  • 先执行尺寸调整(保留更多原始信息)后执行灰度转换(减少最后一步的计算量)


网站公告

今日签到

点亮在社区的每一天
去签到