一、功能介绍
这段代码定义了一个名为 create_video_from_images
的函数,用于将一个文件夹中的图像序列合并成一个视频文件。以下是该函数的主要功能和组成部分的分析:
函数参数
- input_folder: 包含图像文件的文件夹路径。
- output_file: 输出视频文件的完整路径。
- frame_rate: 视频的帧率,默认为30 FPS(每秒帧数)。
- resolution: 输出视频的分辨率(宽度,高度),默认为None,表示使用第一张图片的分辨率。
- codec: 视频编码格式,默认为 'XVID'。
主要步骤
-
获取图像文件列表:
- 使用
os.listdir
和列表推导式来获取所有支持格式的图像文件名。 - 对文件名进行排序以保持播放顺序一致。
- 使用
-
确定视频分辨率:
- 读取第一个图像文件来获取其尺寸。
- 如果用户指定了分辨率,则使用指定的分辨率;否则使用第一张图片的分辨率。
-
初始化视频写入器:
- 使用
cv2.VideoWriter_fourcc
创建编码器。 - 创建
cv2.VideoWriter
实例,设置输出文件路径、编码器、帧率和分辨率。
- 使用
-
处理图像文件:
- 使用
tqdm
显示进度条,遍历所有图像文件。 - 读取每个图像文件。
- 如果需要,调整图像大小以匹配输出分辨率。
- 将图像写入视频文件。
- 使用
time.sleep
控制每帧之间的间隔,以匹配帧率。
- 使用
-
释放资源:
- 调用
out.release()
释放视频写入器资源。 - 输出完成信息。
- 调用
使用示例
- 定义输入文件夹路径、输出文件路径、帧率和分辨率。
- 调用
create_video_from_images
函数,传入上述参数。
二、代码
import cv2
import os
import time
from tqdm import tqdm
def create_video_from_images(input_folder, output_file, frame_rate=30, resolution=None, codec='XVID'):
# 获取图片文件列表
images = [img for img in os.listdir(input_folder) if img.endswith((".png", ".jpg", ".jpeg", ".bmp", ".tiff"))]
images.sort() # 按照文件名排序
if not images:
print("未找到图片文件。")
return
# 读取第一张图片以获取宽高
first_image_path = os.path.join(input_folder, images[0])
first_image = cv2.imread(first_image_path)
# 如果用户指定了分辨率,则调整第一张图片的大小
if resolution:
width, height = resolution
else:
height, width, _ = first_image.shape # 使用第一张图片的分辨率
# 初始化视频写入器
fourcc = cv2.VideoWriter_fourcc(*codec)
out = cv2.VideoWriter(output_file, fourcc, frame_rate, (width, height))
frame_duration = 1 / frame_rate # 每帧之间的时间间隔
for image in tqdm(images, desc="Processing images"):
image_path = os.path.join(input_folder, image)
frame = cv2.imread(image_path)
# 如果图片的大小与输出分辨率不同,则调整大小
if resolution:
frame = cv2.resize(frame, (width, height))
out.write(frame)
time.sleep(frame_duration) # 控制帧之间的间隔
out.release()
print(f"视频已保存到 {output_file}")
# 使用示例
input_folder = 'imgs_chouzhen' # 输入文件夹路径
output_file = 'imgs2video/video/output_video4.avi' # 输出视频文件路径
frame_rate = 24 # 设置帧率
resolution = (640, 480) # 设置输出分辨率 (宽, 高);如果为 None 则使用原始图片分辨率
create_video_from_images(input_folder, output_file, frame_rate, resolution)