当前位置: 首页 > news >正文

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

概要

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

安装依赖

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

pip install opencv-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) 前加上:

img = cv2.resize(img, (1280, 720))

相关文章:

  • 关于Python的一些基础知识(太阳太阳,持续更新)
  • C++的设计模式
  • 虚拟机科普+虚拟机的安装
  • langchain学习笔记之基于RAG实现文档问答
  • leetcode_位运算 2206. 将数组划分成相等数对
  • Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境
  • 【新人系列】Golang 入门(一):基础介绍
  • 【AI学习笔记】2月10日李飞飞巴黎AI峰会演讲:探索 AI 的历史、现状与未来
  • Python CNN基于深度学习的轴承故障智能检测平台
  • JavaScript实现一个函数,找出数组中重复出现次数最多的元素。
  • 垂类大模型微调(一):认识LLaMA-Factory
  • 芯谷D2761:为扬声器保护而生的音频限幅器
  • [Android]AppCompatEditText限制最多只能输入两位小数
  • 在运维工作中,硬盘满了,新买了一块,如何扩容?
  • Linux按照日期定时删除elasticsearch索引
  • 适合开发独立数据库SaaS系统的编程语言选择
  • 解决ExtJS 6/7无限滚动表格/列表(infinite: true)无法在触屏Windows浏览器上触摸滚动
  • mysql的源码包安装
  • 【redis】redis内存管理,过期策略与淘汰策略
  • QT串口通信之二,实现单个温湿度传感器数据的采集(采用Qt-modbus实现)
  • 有中文网站 怎么做英文网站/网络推广公司如何做
  • 无锡网站建设多少钱/百度推广首页
  • 网站数据库问题/三只松鼠网络营销方案策划书
  • 济南网站优化排名/seo论坛站长交流
  • wordpress图片下一张/seo就是搜索引擎广告
  • 无锡网站制作/市场调研报告范文