使用 Python 和 OpenCV 从一组图片生成 MP4 格式的视频

概要

在创建动画、制作幻灯片,从生成的图像数据中导出动态视频时,我们需要将一系列静态图片合成一个视频。

安装依赖

代码需要安装 OpenCV 库。可以通过命令行安装:

pip install opencv-python

完整代码

图片尺寸不一时见后文 调整视频尺寸

python 复制代码
import cv2
import os

# 设置图像文件夹路径
image_folder = 'person'
# 输出视频文件名
output_video = 'person.mp4'

# 获取所有图片文件
images = [img for img in os.listdir(image_folder) if img.endswith(".jpg") or img.endswith(".png")]
images.sort()  # 根据文件名排序

# 读取第一张图片,获取图片的尺寸
first_image_path = os.path.join(image_folder, images[0])
frame = cv2.imread(first_image_path)
height, width, layers = frame.shape

# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')    ##mp4v,mp4格式 ; XVID,avi格式
# 创建视频写入对象,帧率设置为30
video = cv2.VideoWriter(output_video, fourcc, 30, (width, height))

# 循环读取每一张图片,并写入视频
for image in images:
    image_path = os.path.join(image_folder, image)
    img = cv2.imread(image_path)
    video.write(img)

# 释放视频写入对象
video.release()

print("视频生成完毕,保存为:", output_video)

代码解析

  • 导入必要的库:我们导入了两个库:cv2 用于图像处理和视频生成,os 用于操作文件系统。

  • 设置图片文件夹路径和输出视频文件名:我们设定了 image_folder = 'person',指示图像存放的位置,同时设定了输出视频文件的名称为 person.mp4。

  • 获取所有图片文件:使用 os.listdir(image_folder) 获取文件夹中的所有文件。接着,我们通过条件筛选出所有以 .jpg 或 .png 为后缀的文件,确保我们处理的是图片文件。

  • 读取第一张图片,获取尺寸:通过读取第一张图片,获得图像的高度和宽度,这些信息在创建视频时会用到,以确保视频的尺寸与图片一致。

  • 定义视频编码器:我们使用 cv2.VideoWriter_fourcc(*'mp4v') 来指定视频编码格式为 mp4v,这是常用于 MP4 格式的视频编码器。如果你想使用 AVI 格式,可以改为 XVID。

  • 创建视频写入对象:使用 cv2.VideoWriter 创建一个视频写入对象,并设定输出文件名、编码器、帧率和视频尺寸。在这个例子中,我们将帧率设置为 30,适合大多数视频播放的需求。

  • 写入每一张图片到视频:循环遍历所有图片,读取每一张图片并使用 video.write(img) 将其写入视频文件。

  • 释放视频写入对象:最后,调用 video.release() 释放资源,完成视频生成。

代码优化

调整帧率:

想改变视频的播放速度,可以调整 cv2.VideoWriter() 中的帧率参数。帧率越高,视频播放速度越快,帧率越低,视频播放速度越慢。

调整视频尺寸:

想将所有图片调整为相同的尺寸,可以在写入每张图片之前,使用 cv2.resize() 方法调整图片大小。例如,假设你想将每张图片调整为 1280x720 的尺寸,可以在 video.write(img) 前加上:

python 复制代码
img = cv2.resize(img, (1280, 720))
相关推荐
前端精髓1 天前
结构化输出with_structured_output(抽卡)
python·langchain
尹人入圣1 天前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
微帧Visionular1 天前
AI视频单帧清晰,播放时却闪烁,原因是什么?
人工智能·深度学习·音视频
Nuanyt1 天前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌1 天前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987371 天前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
辰辰观影1 天前
Windows网盘视频播放器推荐:无广告4K HDR怎么选
音视频
专注仿真1 天前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄1 天前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
外收内放1 天前
Python基础语法练习题(75)
开发语言·python·学习