原博客搬移到:https://blog.csdn.net/u013171226/article/details/107680279
做深度学习训练的时候,需要从mp4视频文件中抽帧得到图片数据,其中mp4文件是保存在一个大文件夹下的不同子文件夹下面的,用下面的python脚本实现
import cv2
import os
"""根据传入的目录参数,得到该目录所有子文件夹下的所有的mp4文件"""
def get_mp4path(main_dir):
list_mp4 = []
for root, dirs, files in os.walk(main_dir):
for file in files:
if file.endswith(".mp4"): #只要mp4文件,
#print(os.path.join(root, file))
list_mp4.append(os.path.join(root, file))
return list_mp4 #得到所有的mp4文件的列表(包含路径)
"""根据传入的目录地址和MP4文件的名字,从视频文件中抽帧得到图片数据并保存"""
def get_image(path):
print(path)#调试,记得删除
mp4_path, mp4_name = os.path.split(path) #分别得到目录和文件名
cap=cv2.VideoCapture(path)
i=0
j=0
timeF=50
while(True):
i=i+1
ret,frame=cap.read()
if(i % timeF == 0): #每隔50帧保存一次。
save_name=str(j)+".jpg"
j = j + 1
save_path=os.path.join(mp4_path, save_name)
if (ret):
#cv2.imwrite(save_path, frame) #保存路径中包含中文,不能用imwrite保存,要用下一行的imencode的方法。
ret = cv2.imencode('.jpg'
, frame)[1].tofile(save_path)#[1]表示imencode的第二个返回值,也就是这张图片对应的内存数据
else:
break
if __name__ == '__main__':
#get_image(pathImage)
list_all = get_mp4path(r'F:非国标')## 前面的r是告诉解释器保持字符串的原始值,不要对其中的进行转义,如果不加r,那么路径要改成"F:/非国标"或者"F:\非国标"
for list in list_all:
#print(list)
get_image(list)