Comment créer des miniatures pour des vidéos avec python et opencv





Parfois, en triant les décombres de gros et petits fichiers vidéo dans un dossier (dossiers), il n'y a pas de temps pour examiner le contenu de chaque fichier. C'est là que viennent à l'esprit les soi-disant vignettes, qui vous permettent de créer une idée du contenu sous la forme de découpage de fragments d'une vidéo.



Créons un petit programme qui créera des vignettes pour chacun des fichiers du dossier Windows actuel et ajoutera une chronologie aux fichiers coupés.



Importation standard de modules au début d'un programme python:



import numpy as np
import cv2
import os


Nous indiquons dans quel dossier rechercher les fichiers et ajoutons un message pour l'utilisateur:



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


Ici, le programme traite tous les fichiers sur le lecteur E dans le dossier 1.



Ensuite, opencv entre dans la bataille, coupe les images et la chronologie pour eux:



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 - le nombre de fichiers dans le tranchage, 12 pièces.



Étant donné que le découpage de la chronologie est en secondes, afin qu'il soit correctement affiché sur les images,

ajoutons une fonction qui conduit au format d'heure 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


Maintenant, nous obtenons les images, réduisons leur taille de 50% et les enregistrons sur le disque en tant que fichiers intermédiaires:



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


Nous collons les fichiers résultants, en utilisant opencv, horizontalement les uns avec les autres, en respectant l'ordre:



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


Collez verticalement les "triplets" résultants:



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


Nous nettoyons le dossier en supprimant les fichiers temporaires:



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


Nous effectuons les procédures ci-dessus pour tous les fichiers vidéo du dossier:



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)


Le code du programme pour ceux à qui j'appartiens, télécharge d'abord le code, puis lit l'article - télécharger .



La chronologie PS n'est pas sans péché et est un peu déconnectée de la vidéo de la chronologie réelle.



Ceci est particulièrement visible sur les gros fichiers vidéo.



All Articles