使用背景
有时候我们需要把很多的图片合成视频,或者说自己写一个脚本去加快或者放慢视频。我写这个的目的,是因为我有一个模型只能处理图片,但是我想看视频的处理效果,于是我先视频变成图片,然后处理好后把图片变成视频,这样就解决需求啦。
代码实现
首先先说明需要自己修改的参数,代码如下:
if __name__ == '__main__':
im_dir = ' ' # 图片帧存放路径,这里写一个文件夹
dir_list=os.listdir(im_dir)
fps = 20 # 设置一个帧率,每秒钟帧数越多,视频就越快
dir_video=' ' #合成后视频的存放视频
video_dir = dir_video + '.avi'
frame2video(im_dir, video_dir, fps)
然后再设置一个方法,来储存截取后的图片:
def frame2video(im_dir, video_dir, fps):
im_list = os.listdir(im_dir)
im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
img = Image.open(os.path.join(im_dir, im_list[0]))
img_size = img.size # 获得图片分辨率,文件夹下的图片分辨率需要一致,要是不一致可以写一个if函数resize一下~
fourcc = cv2.VideoWriter_fourcc(*'XVID') # opencv版本是3
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
for i in im_list:
im_name = os.path.join(im_dir + i)
frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
videoWriter.write(frame)
videoWriter.release()
print('Done')
大功告成,下面是能运行的代码
import cv2
import os
import numpy as np
from PIL import Image
def frame2video(im_dir, video_dir, fps):
im_list = os.listdir(im_dir)
im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
img = Image.open(os.path.join(im_dir, im_list[0]))
img_size = img.size
fourcc = cv2.VideoWriter_fourcc(*"mp4v") # opencv版本是3
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
for i in im_list:
im_name = os.path.join(im_dir +'\\'+ i)
frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
videoWriter.write(frame)
videoWriter.release()
print('Done')
if __name__ == '__main__':
im_dir =r'F:\put_imgs1'
dir_list=os.listdir(im_dir)
fps = 30
dir_video='F:\put_videos_3s'
video_dir = dir_video +'\\'+ '.mp4' #因为我要存的是mp4格式,所以改了点点代码
frame2video(im_dir, video_dir, fps)