python遍历目录下的所有目录和文件,并用opencv从mp4文件中抽帧得到图片

原博客搬移到: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)