分享

Python实现图片和视频的相互转换

天网云 发表于 2021-12-31 00:31:27 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 5744
目录


  • 操纵背景
  • 1、视频转图象
  • 2、图象转视频

操纵背景

偶然候我们需求把许多的图片分解视频,大概道本人写一个剧本来放慢大概放缓视频;
也偶然候需求把视频裁剪成图片,举办后绝操纵。
那里供给两种办法,一是视频转图象;两是图象转视频。 

1、视频转图象

偶然候我们需求把文件夹中的视频根据必定的帧率截与图片,如一秒与三张,为了完成那一需供,我特地编写了代码完成,而且附上了非常详细的阐明,为了便利大家改代码完成本人需供(次要为了赐顾帮衬刚教python的大概只需求用那一需供的小火伴),本专文的特性以下:

         
  • 间接改动输进文件夹战输出文件夹的地位,就能够完成功用     
  • 输出的图片能根据必定格局定名,那里是以20210823_0001定名     
  • 一一遍历文件夹中视频,序号之间能够持续(也可没有持续,需求改代码)     
  • 操纵单线性插值办法,便算图片变年夜了,也能包管分辩率(闭于单线性,那里只是挪用opencv办法完成,详细真今世码战道理可看我下一篇专文)     
  • 代码注释非常详细,一看便懂
非常详细代码完成
首先先阐明需求本人修正的参数,代码以下:
  1. filepath = 'C:/Users/ZFG/Desktop/1111' #视频文件夹地点目次
  2. data='20210823'   #如果贮存的文件为20210823_0001格局,则为前半部门
  3. save_filename='C:/Users/ZFG/Desktop/2222/'  #贮存图片的文件夹的地点
  4. timeF = 6   #按照一秒与几帧设置,好比我的视频是24帧/秒,与6则一秒与三张
  5. kernal=(700,700)  #设置输出的巨细,按照本人需供设置
复造代码
然后再设置一个办法,去贮存截与后的图片:
  1. def saveImage(image,SaveAddress,num):  #image为读与的图片,SaveAddress为需求存的地点,num为截与图片时分记载的序号
  2.     address= SaveAddress+data+'_'+str(num).zfill(4)+'.jpg'   #那里设置输特别式
  3.     cv2.imwrite(address,image) #那里为存图片
复造代码
以后读与文件夹:
  1. pathDir = os.listdir(filepath)
复造代码
  1. i=0
  2. j=0
  3. for allDir in pathDir:  #遍历文件夹中的每个视频
  4.     videopath =filepath+'/'+ allDir
  5.     videoCapture=cv2.VideoCapture(videopath)  #输进尽对途径
  6.     untill,picture=videoCapture.read()  #读与视频,视频读与完的时分,返回的untill为False,暗示视频读与终了
  7.     while untill:
  8.         i+=1
  9.         if (i%timeF==0):    #按照本视频的帧率看截图图片的频次
  10.             j+=1
  11.             picture=cv2.resize(picture,kernal,cv2.INTER_LINEAR)  #那里挪用了opencv中的单线性插值法,如果图片增长很快,包管了图片粗度
  12.             saveImage(picture,save_filename,j)  #挪用我们之前形貌的办法
  13.             pass
  14.         untill, picture = videoCapture.read()  #再次看视频能否完毕,完毕了则until为False
复造代码
将上诉代码分离后,终极法式以下所示:
  1. import cv2 import os  i = 0 j = 0pathDir = os.listdir(filepath)filepath = 'C:/Users/ZFG/Desktop/1111' data='20210823' save_filename='C:/Users/ZFG/Desktop/2222/' timeF = 6 kernal=(700,700) def saveImage(image,SaveAddress,num):     address= SaveAddress+data+'_'+str(num).zfill(4)+'.jpg'     cv2.imwrite(address,image) for allDir in pathDir:     videopath =filepath+'/'+ allDir     videoCapture=cv2.VideoCapture(videopath)     untill,picture=videoCapture.read()     while untill:         i+=1         if (i%timeF==0):             j+=1             picture=cv2.resize(picture,kernal,cv2.INTER_LINEAR)             saveImage(picture,save_filename,j)             pass         untill, picture = videoCapture.read()
复造代码
最初看下结果吧:
第一张图是文件夹中的视频,帧率是24帧/秒,第两张图是一秒与三张图片后,图片贮存正在文件夹中的图。
web前端-云社区Python实现图片和视频的相互转换byun.com(1)
                               
登录/注册后可看年夜图

web前端-云社区Python实现图片和视频的相互转换byun.com(2)
                               
登录/注册后可看年夜图


2、图象转视频

偶然候我们需求把许多的图片分解视频,大概道本人写一个剧本来放慢大概放缓视频。我写那个的目标,是由于我有一个模子只能处理图片,可是我念看视频的处理结果,因而我先视频变成图片,然后处理好后把图片变成视频,如许便处理需供啦~
非常详细代码完成
首先先阐明需求本人修正的参数,代码以下:
  1. if __name__ == '__main__':
  2.     im_dir = ' '  # 图片帧寄存途径,那里写一个文件夹
  3.     dir_list=os.listdir(im_dir)
  4.     fps = 20  # 设置一个帧率,每秒钟帧数越多,视频便越快
  5.     dir_video=' ' #分解后视频的寄存视频
  6.     video_dir = dir_video + '.avi'
  7.     frame2video(im_dir, video_dir, fps)
复造代码
然后再设置一个办法,去贮存截与后的图片:
  1. def frame2video(im_dir, video_dir, fps):
  2.     im_list = os.listdir(im_dir)
  3.     im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
  4.     img = Image.open(os.path.join(im_dir, im_list[0]))
  5.     img_size = img.size  # 得到图片分辩率,文件夹下的图片分辩率需求分歧,如果纷歧致能够写一个if函数resize一下~
  6.     fourcc = cv2.VideoWriter_fourcc(*'XVID')  # opencv版本是3
  7.     videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
  8.     for i in im_list:
  9.         im_name = os.path.join(im_dir + i)
  10.         frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
  11.         videoWriter.write(frame)
  12.     videoWriter.release()
  13.     print('Done')
复造代码
年夜功乐成
  1. import cv2
  2. import os
  3. import numpy as np
  4. from PIL import Image

  5. def frame2video(im_dir, video_dir, fps):
  6.     im_list = os.listdir(im_dir)
  7.     im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
  8.     img = Image.open(os.path.join(im_dir, im_list[0]))
  9.     img_size = img.size
  10.     fourcc = cv2.VideoWriter_fourcc(*'XVID')  # opencv版本是3
  11.     videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)

  12.     for i in im_list:
  13.         im_name = os.path.join(im_dir + i)
  14.         frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
  15.         videoWriter.write(frame)

  16.     videoWriter.release()
  17.     print('Done')


  18. if __name__ == '__main__':
  19.     im_dir = ' '
  20.     dir_list=os.listdir(im_dir)
  21.     fps = 20
  22.     dir_video=' '
  23.     video_dir = dir_video + '.avi'
  24.     frame2video(im_dir, video_dir, fps)<font face="Arial, Verdana, sans-serif"><span style="white-space: normal;"> </span></font>
复造代码
以上便是Python完成图片战视频的互相转换的详细内乱容,更多闭于Python图片战视频互相转换的材料请存眷剧本之家别的关连文章!
                                                         
       以上所述是云社区专客手艺小编经心给各人收拾整顿的本常识相干引见;期望对亲们进修事情提拔有所协助。                                     若有任何疑问、相干分享交换等,可正在本文章底部留行或批评; 欢送IT手艺妙手亦或菜鸟们各持己见、万马齐喑,让云社区成为IT手艺更好的交换进修仄台;   正在此更万分感激各人对云社区专客网站的撑持!                                                                                                                                                                                                                                                                                            
滥觞:云社区转戴;            免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
回复

使用道具 举报

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

香港云服务器免费试用