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. TCP协议是安全的吗?

    2024-06-11 12:00:05       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 12:00:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 12:00:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 12:00:05       18 阅读

热门阅读

  1. 2024年,计算机相关专业还值得选择吗?

    2024-06-11 12:00:05       8 阅读
  2. Linux-应用编程学习笔记(字符串处理)

    2024-06-11 12:00:05       11 阅读
  3. ASP.NET的WebService跨域CORS问题解决方案

    2024-06-11 12:00:05       11 阅读
  4. Ubuntu中安装Eclipse C++的详细步骤

    2024-06-11 12:00:05       11 阅读
  5. 在 RISC-V 设计中发现可远程利用的漏洞

    2024-06-11 12:00:05       9 阅读
  6. VK Cup 2015 - Round 1 C. The Art of Dealing with ATM

    2024-06-11 12:00:05       10 阅读