笔记:
1.用os库中的os.walk()
函数遍历多个子目录下的视频文件,可以灵活应用于“多个子文件夹,多个视频文件”和“只有一个子文件夹,只有一个视频”的不同情况
#循环遍历多级目录下的文件夹和文件
for root, dirs, files in os.walk()
2.不同视频的图片分别保存在不同的文件夹,文件夹命名可以沿用视频名,但在实际应用中,会遇到各式各样的视频名称,为保证输出的文件夹的规范性,可用“日期+后缀”命名
# 以“日期+后缀”对文件夹命名
os.mkdir(images_path + '/' + '0324_%d' % i)
img_full_path = os.path.join(images_path, '0324_%d' % i) + '/'
# 以“原视频名”对文件夹命名
os.mkdir(images_path + '/' + file_name.split('.')[0])
img_full_path = os.path.join(images_path, file_name.split('.')[0]) + '/'
3.用OpenCV库读取根目录下所有视频文件
#cv2.VideoCapture()根据路径读取视频文件
videos_full_path = os.path.join(root, file_name)
cap = cv2.VideoCapture(videos_full_path)
4.按照指定帧数抽取图片,指定帧数和原视频的帧率会影响抽取到的图片数量,根据个人需求设置帧数
#这里表示每隔50帧抽取1张图片
frame_count += 1
if frame_count % 50 == 0
5.在某些实际应用项目中,例如深度学习,需要用到指定分辨率大小的图片数据集
#将抽取到的图片直接resize到指定的分辨率
frame = cv2.resize(frame, (1280, 720))
6.对于图片的命名,在后期的某些操作中避免出现重名情况,图片命名也可以有两种方式
#以“日期+后缀+帧数”对图片命名
name = img_full_path + "0324_%d_%06d.jpg" % (i, frame_count)
# 以“原视频名+帧数”对图片命名
name = img_full_path + file_name.split('.')[0]+"_%06d.jpg" % (frame_count)
7.视频存放的文件夹和图片存放的文件夹应保持在同一级目录下(如下图)
参考博文:
python批量和单独将视频转为图片帧
整体代码如下:
#!/usr/bin/env python
# coding=utf-8
import os
import cv2
# 视频路径和图片保存路径
videos_path = r"E:\dataset\ZhongChe_data\sdg\0319\videos"
images_path = r"E:\dataset\ZhongChe_data\sdg\0319\images"
if not os.path.exists(images_path):
os.makedirs(images_path)
# 遍历读取视频文件---支持多级目录下的视频文件遍历
i = 0
file_count = 0
for root, dirs, files in os.walk(videos_path):
for file_name in files:
file_count += 1
i += 1
# os.mkdir(images_path + '/' + '0324_%d' % i)
# img_full_path = os.path.join(images_path, '0324_%d' % i) + '/'
os.mkdir(images_path + '/' + file_name.split('.')[0])
img_full_path = os.path.join(images_path, file_name.split('.')[0]) + '/'
videos_full_path = os.path.join(root, file_name)
cap = cv2.VideoCapture(videos_full_path)
print('\n开始处理第 ', str(i), ' 个视频:'+file_name)
# 以指定帧数抽取图片并保存
frame_count = 0
ret = True
while ret:
ret, frame = cap.read()
frame_count += 1
if frame_count % 50 == 0:
# frame = cv2.resize(frame, (1280, 720))
# name = img_full_path + "0324_%d_%06d.jpg" % (i, frame_count)
name = img_full_path + file_name.split('.')[0]+"_%06d.jpg" % (frame_count)
cv2.imwrite(name, frame)
print('\n一共 ', str(file_count), ' 个视频,', '已全部处理完毕!')