先上代码:
网上找的脚本python 实现将视频转换为图片。
"""
将视频转换为图片,可以为多个文件夹下的图片。
注:在程序使用前需先配置好main中的地址
视频路径:video_path_list = [path1, path2, ...](路径数量可以为[1,n],每个路径下的视频数也可为[1,m])
paht1 path2 ....
|------video1.avi |-----video1.avi
|------vidoe2.avi |-----...
|------....
图片存储路径:image_save_dir = save_path(存储方式则将按以下方式)
save_path
| -------path1_name
|----video1
|----jpg1.jpg
|----jpg2,jpg
|----video2
...
|-------path2_name
...
"""
import cv2
import os
from pathlib import Path
VID_FORMATS = ('.mov', '.avi', '.mp4', '.mpg', '.mpeg', '.m4v', '.wmv', '.mkv', '.mp3')
def videos2images(root_video_path, root_save_dir):
for video_dir_path in root_video_path:
# 1.检测读取文件路径是否正确
path_video = Path(video_dir_path)
if path_video.is_dir():
print(video_dir_path + '\t ok')
videos = os.listdir(video_dir_path)
else:
print('\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!')
return
# 2. 生成存储文件夹
save_name_dir = Path(path_video.name)
save_name_dir = os.path.join(root_save_dir, save_name_dir)
if not os.path.exists(save_name_dir):
os.makedirs(save_name_dir)
file_count = 0
for video in videos:
# 判断是否为视频文件,如果不是视频文件则跳过并进行说明
if Path(video).suffix in VID_FORMATS:
file_count += 1 # 视频文件数+1
save_jpg_dir = os.path.join(save_name_dir, Path(video).stem)
if not os.path.exists(save_jpg_dir):
os.makedirs(save_jpg_dir)
each_video_path = os.path.join(path_video, video)
save_dir = save_jpg_dir
else:
print('\033[33mLine56 warning: \033[33m' + os.path.basename(video) + ' is not a video file, so skip.')
continue
# 3. 开始转换。打印正在处理文件的序号和他的文件名,并开始转换
print('\033[38m' + str(file_count) + ':' + Path(video).stem + '\033[38m')
cap = cv2.VideoCapture(each_video_path)
flag = cap.isOpened()
if not flag:
print("\033[31mLine 65 error\033[31m: open" + each_video_path + "error!")
frame_count = 0 # 给每一帧标号
while True:
frame_count += 1
flag, frame = cap.read()
if not flag: # 如果已经读取到最后一帧则退出
break
if os.path.exists(
save_dir + str(frame_count) + '_t.jpg'): # 在源视频不变的情况下,如果已经创建,则跳过
break
cv2.imwrite(save_dir + '\\' + str(frame_count) + '_t.jpg', frame) #图片名字
cap.release()
print('\033[38m' + Path(video).stem + ' save to ' + save_dir + 'finished. \033[38m') # 表示一个视频片段已经转换完成
if __name__ == '__main__':
# 需要转换的视频路径列表,直达视频文件(自定义修改)
video_path_list = [r'E:\Code\feature_extraction_svm\video/', r'E:\Code\feature_extraction_svm\video2'] # 两个源文件夹
# 预期存储在的主文件夹,即'result'文件夹下
image_save_dir = r'E:\Code\feature_extraction_svm\result2'
path_save = Path(image_save_dir)
if not path_save.exists():
path_save.mkdir()
# 进行转换
videos2images(video_path_list, image_save_dir)
结果展示:
成功运行:
视频所在文件夹:
图片导出位置如下所示:
主程序
视频路径和存储输出路径
原博是支持多个路径 每个路径下多个视频的
video_path_list = [r'video1',r'video2']
image_save_dir = r'results'
判断存储路径是否存在,若不存在则创建。
if not path_save.exists():
path_save.mkdir()
进入自定义的转换函数
遍历“路径列表”for video_dir_path in root_video_path:
1.检测读取文件路径是否正确
# 1.检测读取文件路径是否正确
path_video = Path(video_dir_path)
if path_video.is_dir():
print(video_dir_path + '\t ok')
videos = os.listdir(video_dir_path)
else:
print('\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!')
return
path_video = Path(video_dir_path)
拉出单个路径地址判断
.is_dir()判断路径是否存在
若存在路径赋值给videos
若不存在输出警告
'\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!'
意为
(31m:前景色红色)Line36 error: 地址is not exist!
如图所示:
该错误为绝对路径具体到某个视频,把黄线处删除即可