Python ツール: ビデオから画像を抽出する

import cv2
import os
import hashlib

#视频文件名与对应提取帧数的索引
file_dict = {
    
    "2017-07-04-07-39-28_fovs5.h264": (list(range(2030,3150)) + list(range(3960,4050))),
             "2017-07-04-09-41-55_fovs5.h264": (list(range(1100,1700)) + list(range(2430,4450))),
             "2017-07-04-09-50-22_fovs5.h264": (list(range(0,1240)) + list(range(2200,9000)) + list(range(11320,14000)))}

#计算视频文件的md5值
def getFileMD5(filepath):
    f = open(filepath, 'rb')
    md5obj = hashlib.md5()
    md5obj.update(f.read())
    hash = md5obj.hexdigest()
    f.close()
    return str(hash).upper()

#提取视频中对应帧数段的图片
def selct_sample(video_path,target_path,video_index,filemd5,frameFrequency,extract_num):
    
    cap = cv2.VideoCapture(video_path)
    frame_index = 0
    while True:
        res, image = cap.read()
        if not res:
            print('not res, not image')
            break

        if frame_index % frameFrequency == 0 and frame_index in extract_num:
            image_name = ("{}_{}_{}.png".format(
                          (str(video_index)).zfill(4),  #视频的序列索引
                          filemd5,      #视频的md5值
                          (str(frame_index)).zfill(5))  #帧数
                         )
            cv2.imwrite(os.path.join(target_path,image_name),image)
            print("正在截取:{} ---> {}帧".format(os.path.basename(target_path),frame_index))
        frame_index += 1
    print("图片提取结束")
    cap.release()


def gen_sample(video_path,target_path,video_index,filemd5,frameFrequency):

    cap = cv2.VideoCapture(video_path)
    frame_index = 0
    while True:
        res, image = cap.read()
        if not res:
            print('not res, not image')
            break
        if frame_index % frameFrequency == 0:
            image_name = ("{}_{}_{}.png".format(
                          (str(video_index)).zfill(4),  #视频的序列索引
                          filemd5,      #视频的md5值
                          (str(frame_index)).zfill(5))  #帧数
                         )
            cv2.imwrite(os.path.join(target_path,image_name),image)
            print("正在截取:{} ---> {}帧".format(os.path.basename(target_path),frame_index))
        frame_index += 1
    print("图片提取结束")
    cap.release()


def main():
    #需要处理的视频路径; linux和windows下面注意路径的读取方式有所不同
    src_path = r'D:/Desktop/fovs5_rc/02/'
    #目标文件夹路径
    target_path = r'D:/Desktop/fovs5_rc/02/'
    #设置间隔帧数
    frameFrequency = 10
    # 获取文件路径
    filelist = os.listdir(src_path)
    video_num = len(filelist)
    print("视频个数为:%d" % video_num)
    for item in filelist:
        #设置视频的索引个数
        video_index = 0
        if item.endswith(('.h264','.mp4','.mkv','avi')):
            video_path = os.path.join(src_path,item)
            #获取视频唯一的md5值
            filemd5 = getFileMD5(video_path)
            filename  = item.split(".")[0]
            outPutDir = os.path.join(target_path,filename)
            if not os.path.exists(outPutDir):
                os.mkdir(outPutDir)
            #截取图片
            gen_sample(video_path,outPutDir,video_index,filemd5,frameFrequency)
#            extract_num = file_dict[item]
#            selct_sample(video_path,outPutDir,video_index,filemd5,frameFrequency,extract_num)
            video_index += 1

if __name__ == '__main__':
    main()
  • ビデオの md5 値を読み取ることで、ビデオ ファイルのバッチ処理時に生成された画像ファイル名が重複しないようにすることができ、実際の状況に応じて対応するタグを画像の名前に追加できます。
  • select_sample は、ビデオ内の特定のフレーム数の画像の抽出をサポートしていますが、ほとんど使用されません。
  • コードの実行時に、対応する情報が出力されます。
    ここに画像の説明を挿入します
  • コードを実行すると、設定された間隔フレーム数に従って、対応するターゲット フォルダーに対応するファイルが生成されます。たとえば、10 フレームごとに 1 フレームを設定すると、次の結果が得られます。
    ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_44804542/article/details/117283765