yolov5炼丹需要大量图片,在手上有视频素材的前提下,可以截图大量图片。找了下网上的代码都不太符合要求,干脆自己写一个。
输入:指定位置文件夹里的全部视频
输出:指定位置文件夹,图片从0开始依次排好,就算截n个视频也不会重复标签。
如果有懂优化效率的可以帮忙看看代码,总感觉跑得有些慢……
import cv2
import os
import time
'''
注意路径名和文件名不能有中文
路径之间加双斜杠
'''
# 视频数据主目录,需要自行修改,否则报错
video_path = 'C:\\Users\\example\\videos\\origin video'
# 帧文件保存目录,需要自行修改,否则报错
save_path = 'C:\\Users\\example\\videos\\saved picture'
framerate = 3 # 每秒读取约30/n张图片,即每隔n帧截取一帧。修改该参数即可修改图片总数
# 视频读取函数
def video_split(v_name, # 读取视频名字
pic_num, # 视频中帧总数
framerate # 帧数截取间隔,每隔n帧截取一阵
):
v_path = video_path + '\\' + v_name # 读取视频地址
cap = cv2.VideoCapture(v_path) # 读取视频
rval = cap.isOpened() # 判断是否读取成功
while rval:
rval, frame = cap.read() # 获取视频帧数图片
if rval:
if (pic_num % framerate == 0): # 符合第n帧取帧数图的条件
cv2.imwrite(save_path + '\\' + str(int(pic_num/framerate)) + '.jpg', frame)
pic_num += 1
# cv2.waitKey(1)
return pic_num # 返回第n个视频的帧总数
pic_num = 0 # 图片序号
video_num = 0 # 视频个数
start_time = time.time()
print('正在读取视频……')
videos = os.listdir(video_path) # 读取所有视频列表
if videos:
print('正在截图,请稍后……')
for video in videos:
pic_num = video_split(video, pic_num, framerate)
video_num += 1
end_time = time.time()
print('截取图片完成!')
print( '从'+
str(video_num)+
'个视频中共截取约'+
str(int(pic_num/framerate))+
'张图片,每秒截取约'+
str("%.1f"%(30/framerate))+
'张图片,共耗费'+
str("%.2f"%(end_time - start_time))+
'秒')
else:
print('没有检测到视频。请在指定文件夹中放入视频,或检查文件夹路径是否错误')
如果要批量修改文件名的话可以使用如下python代码
import os
import time
# 文件路径,自行修改。注意最后也必须加\\
path = 'C:\\Users\\example\\videos\\origin video\\'
# 获取该目录下所有文件,存入列表中
fileList = os.listdir(path)
n = 0
for i in fileList:
oldname = path + fileList[n] # 旧文件名(路径+文件名)
newname = path + time.strftime("%Y%m%d_%H%M%S_", time.localtime()) + str(n)+ '.jpg' # 新文件名 日期+时间+编号
os.rename(oldname,newname) # 用os模块中的rename方法对文件改名
print(oldname,'======>',newname)
n+=1