We can use python moviepy to convert images to a video file. Here are tutorials:
Python MoviePy Convert Images (PNG, JPG) to Video – Python MoviePy Tutorial
Python MoviePy Convert Different Size Images (PNG, JPG) to Video – Python MoviePy Tutorial
However, the converted effect is not good. Fortunately, we also can use python opencv to convert images to a video file. In this tutorial, we will introduce how to do.
Preliminary
In order to conver to images to video using python opencv, you should resize all images to the same width and height. Otherwsie, you may get error.
Resize image width and height
We will use python opencv to resize all images to make them same size. Here is a function.
def resize(img_array, align_mode): _height = len(img_array[0]) _width = len(img_array[0][0]) for i in range(1, len(img_array)): img = img_array[i] height = len(img) width = len(img[0]) if align_mode == 'smallest': if height < _height: _height = height if width < _width: _width = width else: if height > _height: _height = height if width > _width: _width = width for i in range(0, len(img_array)): img1 = cv2.resize(img_array[i], (_width, _height), interpolation=cv2.INTER_CUBIC) img_array[i] = img1 return img_array, (_width, _height)
Of course, you also can use python pillow to resize all images.
Best Pracice to Python Resize Images with Pillow – Python Tutorial
Convert images to video using python opencv
After having resizing all images, we can convert all images to a video file. Here is a function.
def images_to_video(images, video_file): # make all image size is same img_array = [] for i in images: img = cv2.imread(i) if img is None: continue img_array.append(img) img_array, size = resize(img_array, 'largest') fps = 1 out = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'DIVX'), fps, size) for i in range(len(img_array)): out.write(img_array[i]) out.release()
As to images_to_video() function, it will merge some images and create a video_file.
Here is the full example code:
# coding: utf-8 import cv2 def resize(img_array, align_mode): _height = len(img_array[0]) _width = len(img_array[0][0]) for i in range(1, len(img_array)): img = img_array[i] height = len(img) width = len(img[0]) if align_mode == 'smallest': if height < _height: _height = height if width < _width: _width = width else: if height > _height: _height = height if width > _width: _width = width for i in range(0, len(img_array)): img1 = cv2.resize(img_array[i], (_width, _height), interpolation=cv2.INTER_CUBIC) img_array[i] = img1 return img_array, (_width, _height) def images_to_video(images, video_file): # make all image size is same img_array = [] for i in images: img = cv2.imread(i) if img is None: continue img_array.append(img) img_array, size = resize(img_array, 'largest') fps = 1 out = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'DIVX'), fps, size) for i in range(len(img_array)): out.write(img_array[i]) out.release() files = ['1.png', '2.png', '3.png', '4.png'] images_to_video(files, 'video.avi')
Run this code, you may get this result: