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(int(30/framerate))+
'张图片,共耗费'+
str("%.2f"%(end_time - start_time))+
'秒')
else:
print('没有检测到视频。
请在指定文件夹中放入视频,或检查文件夹路径是否错误')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)