Pythonのビデオや映画のGIFは、フレームによって額縁として保存します

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/lianggyu/article/details/98744359

       OpenCVのは、本明細書映像に基づいて動画像フレームGIF図として保存されます。入力映像の異なるフォーマットによれば、ライン21を変更します。

       図の処理は、PILライブラリは画像シーケンスのための基本的なサポートが含まれている、ビデオを移動するとは異なります。GIFイメージを開くと、自動的に最初のフレームをロードします。画像の読み取りが完了すると、EOFError例外をスローします。我々は、シーク()と()関数は、画像フレームが完成する読み込み伝えることができます。

       このコードの前部は、ファイルを読むことです。データセットのファイル構造は次のとおりです。

|——datasets
     |——action1
           action1_1.gif
           action1_2.gif
           ......
     |——action2
           action2_1.gif
           action2_2.gif
           ......
import cv2
import os
from PIL import Image

video_path = 'PATH_ROOT/datasets/' #视频或gif图像的路径
save_path = 'PATH_ROOT/save/'   #保存帧的路径

action_list = os.listdir(video_path)

for action in action_list:
    if not os.path.exists(save_path+action):
        os.mkdir(save_path+action)
    video_list = os.listdir(video_path+action)
    for video in video_list:
        prefix = video.split('.')[0]
        if not os.path.exists(save_path+action+'/'+prefix):
            os.mkdir(save_path+action+'/'+prefix)
        save_name = save_path + action + '/' + prefix + '/'
        video_name = video_path+action+'/'+video
        name = video_name.split('.')[1]
        if name == "avi":
            cap = cv2.VideoCapture(video_name)
            fps = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
            fps_count = 0
            for i in range(fps):
                ret, frame = cap.read()
                if ret:
                    cv2.imwrite(save_name + str(10000 + fps_count) + '.jpg', frame)
                    fps_count += 1
        if name == "gif":
           im = Image.open(video_name)
           #当打开一个序列文件时,PIL库自动加载第一帧。
           #可以使用seek()函数和tell()函数在不同帧之间移动。实现保存
           try:
              while True:
                   current = im.tell()
                   #为了保存为jpg格式,需要转化。否则可以保存为png
                   img = im.convert('RGB')  
                   img.save(save_name+'/'+str(10000+current)+'.jpg')
                   im.seek(current + 1)
           except EOFError:
               pass

 

おすすめ

転載: blog.csdn.net/lianggyu/article/details/98744359