python+opencv提取.mp4 视频的每一帧并将其保存为图片

提取 .mp4 视频的每一帧并将其保存为图片,可以使用 cv2 库(OpenCV)。下面是一个完整的示例代码,演示如何使用 OpenCV 提取视频的每一帧并将其保存为图片,使用时需要将mp4文件及路径放至video_path ,提取的图片存储的路径放至output_folder

import cv2
import os

def extract_frames(video_path, output_folder):
    # 打开视频文件
    video_capture = cv2.VideoCapture(video_path)
    
    # 检查视频是否成功打开
    if not video_capture.isOpened():
        print(f"Error opening video file: {video_path}")
        return
    
    # 确保输出文件夹存在,如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    frame_count = 0
    while True:
        # 逐帧读取视频
        ret, frame = video_capture.read()
        
        # 如果读取失败,退出循环
        if not ret:
            break
        
        # 翻转图像(垂直翻转)
        frame = cv2.flip(frame, 0)
        
        # 构建帧的输出文件路径
        frame_filename = os.path.join(output_folder, f"frame_{frame_count:04d}.png")
        
        # 保存帧为图片
        cv2.imwrite(frame_filename, frame)
        
        # 打印保存信息
        print(f"Saved: {frame_filename}")
        
        frame_count += 1
    
    # 释放视频捕捉对象
    video_capture.release()
    print("Finished extracting frames.")

# 使用示例
video_path = "example.mp4"  # 输入视频文件路径
output_folder = "output_frames"  # 输出图片保存文件夹

extract_frames(video_path, output_folder)

如果保存的图片方向不对,可以通过使用 cv2.rotate() 函数进行图像反转,比如需要每个图片都顺时针转90度,代码修改如下:

import cv2
import os

def extract_frames(video_path, output_folder):
    # 打开视频文件
    video_capture = cv2.VideoCapture(video_path)
    
    # 检查视频是否成功打开
    if not video_capture.isOpened():
        print(f"Error opening video file: {video_path}")
        return
    
    # 确保输出文件夹存在,如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    frame_count = 0
    while True:
        # 逐帧读取视频
        ret, frame = video_capture.read()
        
        # 如果读取失败,退出循环
        if not ret:
            break
        
        # 旋转图像 90 度(顺时针)
        frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
        
        # 构建帧的输出文件路径
        frame_filename = os.path.join(output_folder, f"frame_{frame_count:04d}.png")
        
        # 保存帧为图片
        cv2.imwrite(frame_filename, frame)
        
        # 打印保存信息
        print(f"Saved: {frame_filename}")
        
        frame_count += 1
    
    # 释放视频捕捉对象
    video_capture.release()
    print("Finished extracting frames.")

# 使用示例
video_path = "example.mp4"  # 输入视频文件路径
output_folder = "output_frames"  # 输出图片保存文件夹

extract_frames(video_path, output_folder)

比如需要每个图片都顺时针转180度,代码修改如下:

import cv2
import os

def extract_frames(video_path, output_folder):
    # 打开视频文件
    video_capture = cv2.VideoCapture(video_path)
    
    # 检查视频是否成功打开
    if not video_capture.isOpened():
        print(f"Error opening video file: {video_path}")
        return
    
    # 确保输出文件夹存在,如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    frame_count = 0
    while True:
        # 逐帧读取视频
        ret, frame = video_capture.read()
        
        # 如果读取失败,退出循环
        if not ret:
            break
        
        # 旋转图像 180 度(顺时针)
        frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
        frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
        
        # 构建帧的输出文件路径
        frame_filename = os.path.join(output_folder, f"frame_{frame_count:04d}.png")
        
        # 保存帧为图片
        cv2.imwrite(frame_filename, frame)
        
        # 打印保存信息
        print(f"Saved: {frame_filename}")
        
        frame_count += 1
    
    # 释放视频捕捉对象
    video_capture.release()
    print("Finished extracting frames.")

# 使用示例
video_path = "example.mp4"  # 输入视频文件路径
output_folder = "output_frames"  # 输出图片保存文件夹

extract_frames(video_path, output_folder)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小菜鸟moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值