代码为批量转换代码,输入为所有vido的存放路径,输出为pic下对应video名的目录,其中对每一帧进行resize操作方便放入模型中使用。
import cv2
import os
from tqdm import tqdm
# 设置输入视频文件夹和输出图片文件夹
#input_folder = r'.\Datasets\CSV\videos'
#output_folder = r'.\Datasets\CSV\pic1'
input_folder = r'\videos\path'
output_folder = r'\pic\path'
os.makedirs(output_folder, exist_ok=True)
# 设置目标大小
target_size = (320, 180)
def process_video(video_path):
# 去除扩展名
video_name_without_extension = os.path.splitext(os.path.basename(video_path))[0]
print(video_path.split('\\')[-2])
# 创建保存帧的目录
output_dir = os.path.join(output_folder, video_path.split('\\')[-2], video_name_without_extension)
os.makedirs(output_dir, exist_ok=True)
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 获取视频帧数
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 使用 tqdm 创建进度条
progress_bar = tqdm(total=frame_count, desc=f'Processing {video_name_without_extension}', unit='frame')
# 等待10ms
# cv2.waitKey(10000)
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
# 循环逐帧读取视频、调整大小并保存为图片
# 找到第一个非空白帧的索引
start_index = 0
for i in range(frame_count):
ret, frame = cap.read()
if ret :
# 调整帧大小
resized_frame = cv2.resize(frame, target_size)
# 生成帧文件名,例如 frame0001.jpg
frame_filename = os.path.join(output_dir, f'frame{i-start_index :04d}.jpg')
cv2.imwrite(frame_filename, resized_frame)
progress_bar.update(1)
else:
start_index += 1
# cv2.waitKey(100)
# 释放视频捕捉对象
cap.release()
print(f'视频逐帧处理完成,共生成{len(os.listdir(output_dir))} /{frame_count} 张调整大小后的图片,保存在 {output_dir} 目录中。')
if __name__ == '__main__':
# 遍历每个文件夹
for folder_name in os.listdir(input_folder):
folder_path = os.path.join(input_folder, folder_name)
# 确保路径是文件夹而不是文件
if os.path.isdir(folder_path):
# 遍历文件夹中的每个视频文件
for video_name in os.listdir(folder_path):
video_path = os.path.join(folder_path, video_name)
# 确保路径是文件而不是文件夹
if os.path.isfile(video_path):
# 处理视频
process_video(video_path)