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