1、要求
需要对指定文件夹(注意路径中不可包含中文,负责分帧失效)下的视频进行逐个分帧,并且指定时间间隔,保存帧的大小格式。
需要讲脚本存放在视频文件夹的同级目录。如图所示
2、代码
import os
import cv2
# 文件路径绝对不可以含有中文,否则运行失效
def filter_video(video, all_formats):
"""
查看video_name视频是否符合格式
:param video: 视频文件名
:param all_formats: 允许格式列表
:return: Bool
"""
if video[-4:] in all_formats:
return True
else:
return False
def video_framing(video_dir, time_interval, all_formats, frame_height, frame_width):
"""
将video_dir目录下的视频逐个分帧保存到对应的文件夹下
:param video_dir: 视频目录
:param frame_height: 帧高
:param frame_ 帧宽
:param time_interval: 时间间隔
:param all_formats: 支持的视频格式列表
:return:
"""
recent_path = os.getcwd()
videos_path = os.path.join(recent_path, video_dir) # 视频存放路径
frame_dir_path = os.path.join(recent_path, "new_"+video_dir)
if not os.path.exists(frame_dir_path):
os.mkdir(frame_dir_path) # 生成新目录保存保存帧,默认目录名new_video_dir
videos_list = os.listdir(videos_path) # 视频文件名列表
# 查看视频是否符合格式,否则剔除
for video in videos_list:
if not filter_video(video, all_formats):
videos_list.remove(video)
# 开始处理
for video in videos_list:
print("processing", video)
video_name = video[:-4]
os.mkdir(os.path.join(frame_dir_path, video_name)) # 为每一个视频创建一个存放帧的目录
each_video_frame_save_path = os.path.join(frame_dir_path, video_name) + "\" # 每一个视频帧预存放路径
each_video_path = os.path.join(videos_path, video) # 每一个视频目前的存放路径
cap = cv2.VideoCapture(each_video_path)
frame_index, frame_count = 0, 0
# 视频是否加载成功
if cap.isOpened():
open_success = True
else:
open_success = False
print("视频加载失败")
try:
# 读取视频帧并写入
while open_success:
read_success, frame = cap.read()
print("------>正在读取第%d帧" % frame_index, read_success)
if frame_index % time_interval == 0:
# resize_frame = cv2.resize(frame, (frame_width, frame_height), interpolation=cv2.INTER_AREA) # 定义帧的格式
frame_name = "%d.jpg" % frame_count
each_video_frame_path_name = os.path.join(each_video_frame_save_path, frame_name) # 每一帧保存路径与帧命名
cv2.imwrite(each_video_frame_path_name, frame)
print("------>写入第%d帧" % frame_count)
frame_count += 1
frame_index += 1
except cv2.error: # 异常处理,每个视频处理结束后会出异常
print(video_name, "处理完成")
cap.release()
if __name__ == "__main__":
# 帧参数
frame_height, frame_width = 320, 240
time_interval = 1000
all_formats = [".MOV", ".mp4", ".MP4"] # 视频支持格式
video_framing("B3", 50, all_formats, frame_height, frame_width)
3、结果
生成新目录,帧保存在新目录