【Python快速入门和实践018】Python常用脚本-图片合成视频

一、功能介绍

        这段代码定义了一个名为 create_video_from_images 的函数,用于将一个文件夹中的图像序列合并成一个视频文件。以下是该函数的主要功能和组成部分的分析:

函数参数

  • input_folder: 包含图像文件的文件夹路径。
  • output_file: 输出视频文件的完整路径。
  • frame_rate: 视频的帧率,默认为30 FPS(每秒帧数)。
  • resolution: 输出视频的分辨率(宽度,高度),默认为None,表示使用第一张图片的分辨率。
  • codec: 视频编码格式,默认为 'XVID'。

主要步骤

  1. 获取图像文件列表

    • 使用 os.listdir 和列表推导式来获取所有支持格式的图像文件名。
    • 对文件名进行排序以保持播放顺序一致。
  2. 确定视频分辨率

    • 读取第一个图像文件来获取其尺寸。
    • 如果用户指定了分辨率,则使用指定的分辨率;否则使用第一张图片的分辨率。
  3. 初始化视频写入器

    • 使用 cv2.VideoWriter_fourcc 创建编码器。
    • 创建 cv2.VideoWriter 实例,设置输出文件路径、编码器、帧率和分辨率。
  4. 处理图像文件

    • 使用 tqdm 显示进度条,遍历所有图像文件。
    • 读取每个图像文件。
    • 如果需要,调整图像大小以匹配输出分辨率。
    • 将图像写入视频文件。
    • 使用 time.sleep 控制每帧之间的间隔,以匹配帧率。
  5. 释放资源

    • 调用 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值