提取 .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)