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

将图片合成为视频(基于 OpenCV)

本文将介绍如何使用 Python 和 OpenCV 将一组图像文件合成为一个视频文件。你将学会:

  • 使用 os 模块遍历文件夹中的图像

  • 使用 cv2.VideoWriter 写入视频

  • 设置分辨率与帧率参数

  • 对图像尺寸进行统一处理

  • 简单的视频生成应用开发


1. 所需模块与安装

本章需要以下 Python 模块:

  • opencv-python:图像处理和视频写入

  • os:文件路径和文件遍历

安装指令(在 Anaconda Prompt 中执行):

pip install opencv-python


2. 合成视频的基本原理

视频本质上是由一帧帧的静态图像按照一定的时间间隔播放形成的。在 OpenCV 中,我们可以通过 cv2.VideoWriter 类将图像写入为一个视频文件。

常见参数说明:

参数含义
output.avi输出文件名,格式可为 .avi.mp4
fps帧率,决定每秒显示几张图
frame_size每帧的分辨率(宽,高)
fourcc编码方式,如 'XVID''mp4v'

3. 示例代码:将图片生成视频

以下是完整的 Python 示例代码:

import cv2
import os# 配置参数
image_folder = 'image_test/'  # 图片目录路径 :ml-citation{ref="3,5" data="citationList"}
output_video = 'output.avi'    # 输出视频文件名
fps = 1                       # 帧率 :ml-citation{ref="5" data="citationList"}
frame_size = (1280, 720)       # 视频分辨率(需与图片尺寸一致):ml-citation{ref="3" data="citationList"}# 获取排序后的图片列表 :ml-citation{ref="5" data="citationList"}
images = [img for img in os.listdir(image_folder) if img.endswith((".jpg", ".png"))]
images.sort()  # 按文件名排序 :ml-citation{ref="5" data="citationList"}# 创建视频写入器
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 编码格式
video = cv2.VideoWriter(output_video, fourcc, fps, frame_size)# 逐帧写入 :ml-citation{ref="3" data="citationList"}
for image in images:img_path = os.path.join(image_folder, image)frame = cv2.imread(img_path)frame = cv2.resize(frame, frame_size)  # 统一尺寸 :ml-citation{ref="3" data="citationList"}video.write(frame)video.release()  # 释放资源 :ml-citation{ref="3" data="citationList"}

4. 注意事项

  1. 图片尺寸必须与 frame_size 一致,否则视频播放时会出现问题。可以使用 cv2.resize 调整图像尺寸。

  2. fps 越高,视频播放越快。根据图片数量和期望总时长灵活设定。

  3. 输出文件格式与编码器要匹配,如 .aviXVID.mp4mp4v


6. 练习题

  1. 修改代码,使视频播放时每张图停留 2 秒。

  2. 修改输出格式为 output.mp4,并使用合适的编码器。

  3. 添加异常处理逻辑,跳过无法读取的图片。


7. 拓展阅读

  • OpenCV 官方文档:https://docs.opencv.org

  • 视频编码格式:XVID, MJPG, H264, mp4v

  • Python 图像处理扩展库:PIL, imageio

http://www.xdnf.cn/news/14084.html

相关文章:

  • 【0.3 漫画数据结构与算法】
  • SNMP中BER编码解析
  • 微信小程序使用画布实现飘落泡泡功能
  • NLP学习路线图(四十八): NLTK
  • ​​实时人脸检测与人脸关键点识别系统实现
  • linux开机原理以及如何开关机-linux023
  • 同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——B
  • 深入剖析 Celery:分布式异步任务处理的利器
  • 项目会议过多如何优化沟通效率
  • [论文阅读] 人工智能 | Gen-n-Val:利用代理技术革新计算机视觉数据生成
  • uni-app项目实战笔记6--同一组件使用Props传递不同的值
  • springMVC-13 文件下载及上传
  • 英伟达诉求1亿IOPS SSD:打破AI算力存储瓶颈
  • 从技术视角解析星黎语音交互机器人的创新与行业影响
  • 分布式定时任务系列12:XXL-job的任务触发为什么是死循环?
  • IPv4详解
  • FWFW - Find Websites From World
  • Vue3中v-bind=“$attrs“用法讲解
  • el-table跨页多选和序号连续
  • Burn 开源程序是下一代深度学习框架,在灵活性、效率和可移植性方面毫不妥协
  • 使用Docker安装FFmpeg
  • 【Jmeter】Jmeter 高并发性能压力测试
  • 融智学教育观及其数学公式体系凝练汇总
  • 儿童智能玩具与传统玩具的区别
  • 倍思Nomos多合一桌面充:第六代氮化镓快充技术加持,性能全面提升
  • 【动手学深度学习】3.4. softmax回归
  • 鸿蒙开发-视频学习及实用中的一些小结
  • pytorch实战波斯顿房价回归模型
  • LINE 接入说明
  • 解决麒麟国产操作系统,分辨率下拉框是空白问题。