本文记录使用opencv-python库将以数字命名的图片合成视频的程序:
import os
from PIL import Image
import cv2
def charts2video(img_path, video_path):
"""将给定目录下的图片转成视频
Args:
img_path: 图片路径
video_path: 输出视频的路径和名称
Returns: 图片转成的视频
来源: 参考博客https://www.cnblogs.com/willwuss/p/12695963.html
"""
images = os.listdir(img_path)
images.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
fps = 6 # 帧数
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
im = Image.open(img_path + images[0])
video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
for img_i in images:
frame = cv2.imread(img_path + img_i)
print('开始将 ' + img_i + ' 加入视频\n')
video_writer.write(frame) # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
video_writer.release()
只需要输入图片路径(例如,imgPath = “./figures/”)和视频路径与名称(如,videoPath = “./test.avi”)就可以调用上面的程序将图片连接成视频。需要注意的是图片尺寸需要一致,不然会跳过尺寸不一致的图片。先下面的程序可以更改图片尺寸
import os
import os.path
from PIL import Image
from typing import Tuple
def resize_image(img_in: str, img_out: str, img_size: Tuple[int, int], save_format: str) -> None:
"""
判断图片尺寸,与给定尺寸不一致更改为指定尺寸,与给定尺寸一致时不进行操作。
Args:
img_in (str): 输入图片路径和名称
img_out (str): 输出图片路径和名称
img_size (tuple[int, int]): 输出图片像素宽度和像素高度
save_format (str): 输出图片类型(png, gif, jpeg...)
Returns:
None: 无返回值,程序操作了文件
"""
img = Image.open(img_in)
img_size_init = img.size
if img_size_init != img_size: # 判断图片尺寸是否需要修改
print(f'图片{img_in}初始尺寸为{img_size_init},被更改为{img_size}\n')
out = img.resize(img_size, Image.ANTIALIAS) # resize image with high-quality
out.save(img_out, save_format)
return None
def resize_img_in_dir(img_path, output_path, img_size, save_format):
"""
更改文件夹中图片的尺寸,以相同的名称存到给定文件夹
Args:
img_path: 输入图片路径
output_path: 输出图片路径
img_size: 输出图片宽度和高度
save_format: 输出图片类型(png, gif, jpeg...)
"""
images = os.listdir(img_path) # 获取文件夹中所有图片的名称
images.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
# 修改图片尺寸
for img_i in images:
resize_image(img_path+img_i, output_path+img_i, img_size, save_format)
return None