Создаем thumbnails для видео с python и opencv

от автора

Порой, разбирая завалы больших и малых видеофайлов в папке(папках) нет времени заглядывать в содержимое каждого файла. Тут на ум приходят так называемые thumbnails, которые позволяют в виде нарезки фрагментов из видео, создать представление о содержимом.

Создадим небольшую программу, которая создаст thumbnails для каждого из файлов в текущей папке windows, и добавит timeline к вырезанным файлам.

Стандартный импорт модулей в начале программы на python:

import numpy as np import cv2 import os 

Укажем, в какай папке искать файлы и добавим сообщение для пользователя:

file=file print('Подождите...') path=r'E:\1' os.chdir(path) 

Здесь программа обрабатывает все файлы на диске E в папке 1.

Далее вступает в бой opencv, нарезает кадры и timeline к ним:

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 штук.

Так как нарезка timeline в секундах, чтобы она корректно отображалась на кадрах,
добавим функцию, приводящую к формату времени 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) 

Код программы для тех, к коим отношусь и я, сначала скачивает код, а потом читает статью — скачать.

P.S. timeline не без греха и немного отрывается от реальной timeline видео.

Особенно это заметно на больших видеофайлах.

ссылка на оригинал статьи https://habr.com/ru/post/516662/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *