pythonとopencvを使用してビデオのサムネイルを作成する方法





フォルダー(フォルダー)内の大小のビデオファイルの瓦礫を並べ替えると、各ファイルの内容を調べる時間がない場合があります。ここでいわゆるサムネイルが思い浮かびます。これにより、ビデオから断片を切り取るという形でコンテンツのアイデアを作成できます。



現在のwindowsフォルダー内の各ファイルのサムネイルを作成する小さなプログラムを作成し、カットされたファイルにタイムラインを追加しましょう。



pythonプログラムの開始時のモジュールの標準インポート:



import numpy as np
import cv2
import os


ファイルを検索するフォルダーを指定し、ユーザーへのメッセージを追加します。



file=file
print('...')
path=r'E:\1'
os.chdir(path)


ここで、プログラムはフォルダ1のEドライブ上のすべてのファイルを処理します。



次に、opencvが戦闘に入り、フレームとタイムラインをカットします。



vidcap = cv2.VideoCapture(path+'\\'+file)
    fps = vidcap.get(cv2.CAP_PROP_FPS)
    #print(fps)
    n=12
    total_frames = vidcap.get(cv2.CAP_PROP_FRAME_COUNT)
    time_line = total_frames / fps

    frames_step = total_frames//n
    time_line_step=time_line//n
    #print(int(time_line_step))
    a=[]
    b=[]


n-スライス内のファイルの数、12個。



タイムラインのスライスは秒単位であるため、フレームに正しく表示される

ため、00:00:00の時間形式につながる関数を追加しましょう



def sec_to_time(t):
        h=str(t//3600)
        m=(t//60)%60
        s=t%60
        if m<10:
            m='0'+str(m)
        else:
            m=str(m)
        if s<10:
            s='0'+str(s)
        else:
            s=str(s)    
        #print(h+':'+m+':'+s)
        t=h+':'+m+':'+s
        return t


これで、画像を取得し、サイズを50%縮小して、中間ファイルとしてディスクに保存します。



for i in range(n):        
        vidcap.set(1,i*frames_step)
        success,image = vidcap.read()
        #  
        scale_percent = 50
        width = int(image.shape[1] * scale_percent / 100)
        height = int(image.shape[0] * scale_percent / 100)
        image=cv2.resize(image, (width, height))

        #     c time_line
        font = cv2.FONT_HERSHEY_COMPLEX    
        t=int(time_line_step)*i    
        image=cv2.putText(image, sec_to_time(t), (100, 30), font, 0.5, color=(0, 0, 255), thickness=0)   
        cv2.imwrite('image'+str(i)+'.jpg',image)
        a.append('image'+str(i)+'.jpg')
    vidcap.release()


結果のファイルをopencvを使用して互いに水平に接着し、順序を確認します。



def glue (img1,img2,img3,x):
        i1 = cv2.imread(img1)
        i2 = cv2.imread(img2)
        i3 = cv2.imread(img3)    
        vis = np.concatenate((i1, i2, i3), axis=1)
        cv2.imwrite('out'+str(x)+'.png', vis)
        b.append('out'+str(x)+'.png')
    x=0
    while x<len(a):    
        glue(a[x],a[x+1],a[x+2],x)
        x+=3


得られた「トリプレット」を垂直に接着します。



 #   
    def glue2 (img1,img2,img3,img4):
        i1 = cv2.imread(img1)
        i2 = cv2.imread(img2)
        i3 = cv2.imread(img3)
        i4 = cv2.imread(img4) 
        vis = np.concatenate((i1, i2, i3,i4), axis=0)
        cv2.imwrite(file[:-4]+'.jpeg', vis)
    glue2(b[0],b[1],b[2],b[3])


一時ファイルを削除してフォルダをクリーンアップします。



#
    c=['jpg', 'png']
    for root, dirs, files in os.walk(path):    
        for file in files:
            if file[-3:] in c:
                os.remove(file)


フォルダ内のすべてのビデオファイルに対して上記の手順を実行します。



video=['wmv', 'mp4', 'avi', 'mov', 'MP4', '.rm', 'mkv']
for root, dirs, files in os.walk(r'E:/1'):    
    for file in files:
        if file[-3:] in video:
            print(' -'+file)
            tumbnail(file)


私が所属する人のためのプログラムコードは、最初にコードをダウンロードし、次に記事を読みます-ダウンロード



PSタイムラインには罪がないわけではなく、実際のタイムラインビデオとは少し触れていません。



これは、大きなビデオファイルで特に顕著です。



All Articles