So erstellen Sie Miniaturansichten für Videos mit Python und OpenCV





Manchmal ist beim Durchsuchen der Trümmer großer und kleiner Videodateien in einem Ordner (Ordnern) keine Zeit, den Inhalt jeder Datei zu untersuchen. Hier kommen die sogenannten Thumbnails in den Sinn, mit denen Sie sich eine Vorstellung vom Inhalt machen können, indem Sie Fragmente aus einem Video ausschneiden.



Lassen Sie uns ein kleines Programm erstellen, das Miniaturansichten für jede der Dateien im aktuellen Windows-Ordner erstellt und den ausgeschnittenen Dateien eine Zeitleiste hinzufügt.



Standardimport von Modulen zu Beginn eines Python-Programms:



import numpy as np
import cv2
import os


Wir geben an, in welchem ​​Ordner nach Dateien gesucht werden soll, und fügen eine Nachricht für den Benutzer hinzu:



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


Hier verarbeitet das Programm alle Dateien auf dem E-Laufwerk im Ordner 1.



Als nächstes tritt opencv in den Kampf ein, schneidet Frames und die Timeline zu ihnen:



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 - die Anzahl der Dateien im Schnitt, 12 Stück.



Da das Timeline-Slicing in Sekunden erfolgt, damit es in Frames korrekt angezeigt wird,

fügen wir eine Funktion hinzu, die zum Zeitformat 00:00:00 führt:



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


Jetzt erhalten wir die Bilder, reduzieren ihre Größe um 50% und speichern sie als Zwischendateien auf der Festplatte:



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()


Wir kleben die resultierenden Dateien mit opencv horizontal miteinander und beachten dabei die Reihenfolge:



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


Kleben Sie die resultierenden "Drillinge" vertikal:



 #   
    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])


Wir bereinigen den Ordner, indem wir temporäre Dateien löschen:



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


Wir führen die obigen Schritte für alle Videodateien im Ordner aus:



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)


Der Programmcode für diejenigen, denen ich angehöre, lädt zuerst den Code herunter und liest dann den Artikel - Download .



Die PS-Timeline ist nicht ohne Sünde und hat ein wenig Kontakt zum echten Timeline-Video.



Dies macht sich insbesondere bei großen Videodateien bemerkbar.



All Articles