Cómo crear miniaturas para videos con python y opencv





A veces, al clasificar los escombros de archivos de video grandes y pequeños en una carpeta (carpetas), no hay tiempo para mirar el contenido de cada archivo. Aquí es donde vienen a la mente las llamadas miniaturas, que le permiten crear una idea del contenido en forma de fragmentos de corte de un video.



Creemos un pequeño programa que creará miniaturas para cada uno de los archivos en la carpeta actual de Windows y agregará una línea de tiempo a los archivos cortados.



Importación estándar de módulos al comienzo de un programa de Python:



import numpy as np
import cv2
import os


Indicamos en qué carpeta buscar archivos y agregamos un mensaje para el usuario:



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


Aquí el programa procesa todos los archivos de la unidad E en la carpeta 1.



A continuación, opencv entra en la batalla, corta los fotogramas y la línea de tiempo a ellos:



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 - el número de archivos en el corte, 12 piezas.



Dado que la división de la línea de tiempo es en segundos, para que se muestre correctamente en los fotogramas,

agreguemos una función que lleve al formato de hora 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


Ahora obtenemos las imágenes, reducimos su tamaño en un 50% y las guardamos en el disco como archivos intermedios:



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


Pegamos los archivos resultantes, usando opencv, horizontalmente entre sí, observando el orden:



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


Pegue los "tripletes" resultantes verticalmente:



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


Limpiamos la carpeta eliminando archivos temporales:



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


Realizamos los procedimientos anteriores para todos los archivos de video en la carpeta:



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)


El código del programa para aquellos a los que pertenezco, primero descarga el código y luego lee el artículo: descarga .



La línea de tiempo de PS no está exenta de pecado y está un poco fuera de contacto con el video de la línea de tiempo real.



Esto es especialmente notable en archivos de video grandes.



All Articles