如何使用python和opencv为视频创建缩略图





有时,在整理文件夹(文件夹)中大大小小的视频文件的废墟时,没有时间查看每个文件的内容。这就是想到的缩略图的地方,它使您可以从视频片段中切出片段的形式来构思内容。



让我们创建一个小程序,该程序将为当前Windows文件夹中的每个文件创建缩略图,并将时间线添加到剪切文件中。



在python程序的开头标准导入模块:



import numpy as np
import cv2
import os


我们指出要在哪个文件夹中查找文件并为用户添加一条消息:



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


在这里,程序将处理E驱动器中文件夹1中的所有文件。



接下来,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