这段代码的主要功能是将视频文件逐帧提取为图像文件,并保存在指定的目录中。每个视频的每第10帧被保存为一个图像文件。如果需要,你可以根据自己的需求进行修改,例如更改图像保存的间隔。
import os
import cv2
from tqdm import tqdm
root1 = r'D:\新建文件夹'
roots = [root1, ]
k = 0
for root in tqdm(roots):
video_list = os.listdir(root)
# 特殊处理文件名----------------下次记得注释------------------
# video_list_yawn = []
# for video_name in video_list:
# if 'Yawn' in video_name:
# video_list_yawn.append(video_name)
# 特殊处理文件名----------------下次记得注释------------------
for video_name in video_list:
# print(video_name)
video_path = os.path.join(root, video_name)
print(video_path)
capture = cv2.VideoCapture(video_path)
if capture.isOpened() is False:
print("Camera Error!")
# 从摄像头读取视频直到关闭
i = 0
ret, frame = capture.read()
j = 1
while ret:
# 通过摄像头捕获 - 帧
ret, frame = capture.read()
i += 1
if i % 10 == 0:
if frame is not None:
cv2.imwrite(f"./images/chxl_{k:04d}.jpg", frame)
print(f'正在保存{video_name}的第{j}帧, 第{k}张照片')
k += 1
j += 1
else:
continue
# #键盘键入’q',关闭摄像头
# if cv2.waitKey(20) & 0xFF == ord('q'):
# break
# 释放资源
capture.release()
cv2.destroyAllWindows()
解释:
-
首先,代码导入了必要的库,包括
os
用于文件和目录操作、cv2
用于图像处理,以及tqdm
用于显示进度条。 -
root1
是包含视频文件的根目录的路径。这个路径指向一个文件夹,里面包含一个或多个视频文件。 -
roots
是一个包含根目录路径的列表,目前只包含一个根目录root1
。 -
代码使用
os.listdir
获取根目录下的所有文件和文件夹的列表,存储在video_list
中。 -
然后,代码进入一个循环,迭代
roots
列表中的根目录。 -
在内部循环中,代码迭代
video_list
列表中的视频文件名。 -
对于每个视频文件,它构建了视频文件的完整路径
video_path
。 -
代码使用 OpenCV 的
cv2.VideoCapture
打开视频文件,准备从中读取帧。 -
如果视频文件无法打开,将打印 "Camera Error!"。
-
接下来,代码进入一个循环,用于逐帧读取视频。在每一帧中,代码检查
i
的值,如果i
除以 10 的余数为 0,则保存当前帧为图像文件。 -
图像文件的名称使用了格式化字符串,其中
k
是一个递增的整数,用于命名图像文件,以确保每个图像都有一个唯一的名称。 -
代码还记录了当前视频的帧数
j
和总共保存的图像数k
。 -
最后,代码释放视频资源并关闭显示窗口。