c语言编程笔录

首页 >   > 笔记大全

笔记大全

使用Python怎么将图片合成为视频

更新时间:2023-10-20

第一段:视频合成的背景知识

在进行视频处理时,经常需要将多张图片合成为一个视频。这在人脸追踪、动态图生成以及视频制作等领域中比较常见。Python在图像处理领域较为流行,这里我们就来介绍一下如何使用Python将图片合成为视频。

import cv2

# 读取一张图片
img = cv2.imread('test.jpg')
# 获取图像大小
width, height = img.shape[:2]

# 设置帧率
fps = 24
# 设置写入视频的CODEC
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
# 创建VideoWriter对象
writer = cv2.VideoWriter('test.avi', fourcc, fps, (width, height))

# 将图片写入视频
writer.write(img)

# 释放资源
writer.release()

第二段:单个图片写入视频

要将多张图片合成为一个视频,必须先将图片一个一个地写入视频。下面的代码示例演示了如何读取一张图片,设置帧率和CODEC,创建VideoWriter对象并写入视频。

import cv2
import os

# 定义要读取的图片目录
img_dir = 'image_dir'
# 设置帧率
fps = 24

# 获取所有图片路径
img_paths = [os.path.join(img_dir, x) for x in os.listdir(img_dir)]

# 获取第一张图片大小
img0 = cv2.imread(img_paths[0])
height, width, channels = img0.shape

# 设置写入视频的CODEC
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
# 创建VideoWriter对象
writer = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

# 逐个读取图片并写入视频中
for img_path in img_paths:
    img = cv2.imread(img_path)
    writer.write(img)

# 释放资源
writer.release()

第三段:多张图片合成为视频

要将多张图片合成为一个视频,只需要将上面的单个图片写入视频的代码放进一个循环里,逐个将图片写入视频即可。

import cv2
import os

# 定义要读取的图片目录
img_dir = 'image_dir'
# 设置帧率
fps = 24

# 获取所有图片路径
img_paths = [os.path.join(img_dir, x) for x in os.listdir(img_dir)]

# 获取第一张图片大小
img0 = cv2.imread(img_paths[0])
height, width, channels = img0.shape

# 设置写入视频的CODEC
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
# 创建VideoWriter对象
writer = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

# 逐个读取图片并写入视频中
for img_path in img_paths:
    img = cv2.imread(img_path)
    writer.write(img)

# 释放资源
writer.release()

第四段:进一步优化

上面的代码虽然可以实现多张图片的合成,但是还存在一些问题。例如当视频分辨率不同时,需要对大小进行转换。以下代码演示了如何将多张图片转换为指定分辨率,然后逐个将转换后的图片写入视频。

import cv2
import os

# 定义要读取的图片目录
img_dir = 'image_dir'
# 设置帧率
fps = 24
# 设置输出视频分辨率
size = (640, 480)

# 获取所有图片路径
img_paths = [os.path.join(img_dir, x) for x in os.listdir(img_dir)]

# 设置写入视频的CODEC
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
# 创建VideoWriter对象
writer = cv2.VideoWriter('output.avi', fourcc, fps, size)

# 逐个读取图片并写入视频中
for img_path in img_paths:
    img = cv2.imread(img_path)
    # 调整图片分辨率
    img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
    writer.write(img)

# 释放资源
writer.release()