一、功能介绍
这段代码的功能是从一个视频文件中抽取指定数量的帧,并将这些帧保存为图像文件。步骤如下:
-
设置路径和参数:
video_path
:视频文件的路径。image_folder
:保存抽取图像的目录。num_frames_to_extract
:需要抽取的帧数。
-
创建输出目录:
- 如果指定的输出目录不存在,则创建该目录。
-
打开视频文件:
- 使用
cv2.VideoCapture
打开视频文件。
- 使用
-
获取视频信息:
- 获取视频的帧率(
fps
)和总帧数(total_frames
)。
- 获取视频的帧率(
-
计算抽取间隔:
- 计算抽取帧的间隔,以确保尽可能均匀地从视频中抽取帧。
- 如果总帧数不能被需要抽取的帧数整除,则增加1以确保最后一帧也能被抽取。
-
循环抽取帧:
- 循环读取视频帧,直到抽取的帧数达到指定数量或读取完视频。
- 使用
cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)
跳转到指定帧。 - 读取帧,并保存为图像文件。
-
保存图像:
- 每次读取到有效帧时,保存为JPEG格式的图像文件。
- 文件名格式为
normal-XXX.jpg
,其中XXX
是三位数的帧序号,不足三位数时前面补零。
-
释放资源:
- 关闭视频文件。
- 清理OpenCV窗口。
二、代码
import cv2
import os
# 视频文件路径
video_path = r'demo.mp4'
# 输出图像目录
image_folder = r'E:\pythonProject\pythonProject\imgs_chouzhen'
if not os.path.exists(image_folder):
os.makedirs(image_folder)
# 指定要抽取的帧数
num_frames_to_extract = 100
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 获取视频总帧数
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 总帧数
# 计算抽取间隔(尽量均匀)
frame_interval = total_frames // num_frames_to_extract
if total_frames % num_frames_to_extract != 0:
frame_interval += 1
frame_count = 0
current_frame = 0
while(current_frame < total_frames and frame_count < num_frames_to_extract):
cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)
ret, frame = cap.read()
if not ret:
break
# 保存图像
img_name = f"normal-{str(frame_count).zfill(3)}.jpg"
img_path = os.path.join(image_folder, img_name)
cv2.imwrite(img_path, frame)
current_frame += frame_interval
frame_count += 1
print(f"Total {frame_count} frames extracted.")
cap.release()
cv2.destroyAllWindows()
改成你的视频路径和保存路径,执行结果: