Python 将大量图像合成视频

fork https://blog.youkuaiyun.com/qq_37080185/article/details/123895700 这位作者进行修改。

找了半天ae教程发现太麻烦了,果然python大法好
需要改的是 size src_path sav_path --再有就帧数

import numpy as np
import cv2
import os


# 1.每张图像大小
size = (1920, 1080)
print("每张图片的大小为({},{})".format(size[0], size[1]))
# 2.设置源路径与保存路径
src_path = r'./train'  #文件夹内只允许有图片
sav_path = r'./test.mp4'

# 需要改的是 size  src_path  sav_path --再有就帧数 


# 3.获取图片总的个数
all_files = os.listdir(src_path)
index = len(all_files)
print("图片总数为:" + str(index) + "张")
# 4.设置视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # MP4格式
#完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息
videowrite = cv2.VideoWriter(sav_path, fourcc, 5, size)  #5是每秒的帧数,size是图片尺寸
# 5.临时存放图片的数组
img_array = []

# 6.读取所有jpg格式的图片 
for base_path, folder_list, file_list in os.walk(src_path):
        # root 表示当前正在访问的文件夹路径
        # dirs 表示该文件夹下的子目录名list
        # files 表示该文件夹下的文件list
        for img_name in file_list:
            img_path=base_path+'/'+img_name
            img = cv2.imread(img_path)
            if img is None:
                print(img_path + " is error!")
                continue
            img_array.append(img)
        # 内部不遍历
        break
    
# 7.合成视频
for i in range(0, index):
 img_array[i] = cv2.resize(img_array[i],size)
 videowrite.write(img_array[i])
 print('第{}张图片合成成功'.format(i))
 
print('------done!!!-------')

<think>好的,我现在需要解决用户的问题:如何使用Python将多帧图片视频,特别是使用cv2或moviepy库。首先,我得回忆一下这两个库的相关知识,可能需要查阅一些资料或者之前的经验。 用户提到了cv2(即OpenCV)和moviepy,这两个都是常用的库。我需要分别整理这两种方法的步骤,确保步骤清晰,并且代码正确。同时,用户提供的引用中有一些关于moviepy的信息,比如引用[2]、[3]、[4]都提到了moviepy的使用,应该可以引用这些资料来支持回答。 首先,关于OpenCV的方法。我记得OpenCV中处理视频通常需要使用VideoWriter对象。需要确定图片的尺寸是否一致,然后设置合适的编解码器、帧率和输出文件名。步骤大致是:读取所有图片,获取第一张图片的尺寸,创建VideoWriter,然后逐帧写入。这里需要注意的是,OpenCV可能需要安装正确的编解码器,比如使用DIVX或XVID。另外,图片可能需要按照顺序读取,如果文件名有规律的话,可以用排序后的列表来处理。 然后是moviepy的方法。根据引用[2]和[3],moviepy处理视频可能更简单一些。moviepy的ImageSequenceClip函数可以直接从图片列表生视频剪辑。需要指定帧率,然后写入视频文件。这种方法可能代码更简洁,但需要安装moviepy库。另外,引用中提到OpenCV效率更高,但moviepy可能更灵活,支持更多格式和操作,比如添加音频等。 接下来,我需要确保代码示例正确。对于OpenCV的例子,可能需要使用cv2.imread读取图片,检查图片是否功加载。然后,使用cv2.VideoWriter_fourcc设置四字符编码,比如'XVID',然后创建VideoWriter对象。然后循环写入每一张图片。注意图片的路径是否正确,以及图片的顺序是否正确排列。 对于moviepy的例子,需要导入ImageSequenceClip,然后指定图片列表和帧率,最后用write_videofile方法输出。这里需要注意的是,图片的文件名可能需要按顺序排列,或者用户需要自己排序。此外,moviepy可能需要依赖ffmpeg,所以用户可能需要预先安装ffmpeg。 另外,用户的问题可能还包括一些常见问题,比如图片尺寸不一致导致错误,或者编解码器不可用。在回答中应该提到这些注意事项,帮助用户避免常见陷阱。 现在需要组织回答的结构,先介绍两种方法,分别给出步骤和代码示例,然后可能添加注意事项和引用。根据用户提供的引用,引用[2]和[3]是关于moviepy的,引用[4]提到了OpenCV和moviepy的结合使用,所以可以在适当的地方添加引用标识,比如在提到moviepy时引用[2][3],在OpenCV部分引用[4]。 最后,用户要求生相关问题,可能需要根据主题提出一些扩展问题,比如性能比较、添加音频、处理不同格式等。 总结一下,回答的结构应该是: 1. 使用OpenCV的方法 - 步骤说明 - 代码示例 - 注意事项 2. 使用moviepy的方法 - 步骤说明 - 代码示例 - 注意事项 3. 引用相关资源 4. 相关问题 现在需要检查是否有遗漏的步骤,比如图片读取的顺序是否正确处理,或者是否需要调整颜色空间(例如OpenCV使用BGR格式,而普通图片是RGB)。在OpenCV的例子中,读取的图片已经是BGR格式,所以直接写入没问题。而moviepy可能自动处理为RGB,但ImageSequenceClip应该能正确读取图片。 还需要注意文件路径的处理,比如使用os.path.join或者确保图片路径正确。在代码示例中,可能需要提醒用户替换为自己的图片路径和文件名模式。 在注意事项中,可以提到图片尺寸一致、文件名顺序、编解码器支持、依赖库安装等。 现在开始编写回答,确保使用正确的中文表达,结构清晰,代码正确,并正确添加引用。</think>### 使用Python将多帧图像合成视频的方法 以下是基于`OpenCV`和`moviepy`库实现图像合成视频的详细教程: --- ### 方法一:使用OpenCV(cv2) **步骤说明** 1. **读取所有图片**:确保图片文件名按帧顺序排列(如`frame_001.jpg`, `frame_002.jpg`)。 2. **设置视频参数**:包括帧率、分辨率(需与图片尺寸一致)、编解码器(如`DIVX`或`XVID`)。 3. **创建视频写入对象**:通过`cv2.VideoWriter`生视频文件。 4. **逐帧写入图片**:遍历所有图片并写入视频流。 **代码示例** ```python import cv2 import os # 图片路径和参数设置 image_folder = 'images' # 图片存放文件夹 output_video = 'output.avi' # 输出视频文件名 fps = 24 # 帧率 # 获取图片列表并按文件名排序 images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")] images.sort() # 读取第一张图片以获取分辨率 frame = cv2.imread(os.path.join(image_folder, images[0])) height, width, _ = frame.shape # 创建VideoWriter对象(需安装对应编解码器) fourcc = cv2.VideoWriter_fourcc(*'XVID') video_writer = cv2.VideoWriter(output_video, fourcc, fps, (width, height)) # 逐帧写入 for image in images: img_path = os.path.join(image_folder, image) frame = cv2.imread(img_path) video_writer.write(frame) video_writer.release() ``` **注意事项** - 图片分辨率需一致,否则写入会失败。 - 编解码器需与输出文件后缀匹配(如`.avi`对应`XVID`)。 - 若需输出其他格式(如`.mp4`),可能需要调整编解码器为`mp4v`[^4]。 --- ### 方法二:使用moviepy **步骤说明** 1. **导入库并设置参数**:指定图片路径、帧率、输出文件名。 2. **生视频剪辑对象**:通过`ImageSequenceClip`将图片序列转换为视频片段。 3. **导出视频**:调用`write_videofile`生最终视频文件。 **代码示例** ```python from moviepy.editor import ImageSequenceClip import os # 图片路径和参数设置 image_folder = 'images' # 图片存放文件夹 output_video = 'output.mp4' # 输出视频文件名 fps = 24 # 帧率 # 获取图片列表并按文件名排序 images = [os.path.join(image_folder, img) for img in os.listdir(image_folder) if img.endswith(".jpg")] images.sort() # 生视频剪辑并导出 clip = ImageSequenceClip(images, fps=fps) clip.write_videofile(output_video, codec='libx264') ``` **注意事项** - 需提前安装`moviepy`和`ffmpeg`(通过`pip install moviepy`)。 - 默认使用`libx264`编码生`.mp4`文件,支持添加音频轨道[^2][^3]。 --- ### 方法对比 | **库** | **优点** | **缺点** | |----------|---------------------------------------|---------------------------| | OpenCV | 执行效率高,适合处理大量图片 | 编解码器配置较复杂 | | moviepy | 代码简洁,支持音频和复杂剪辑操作[^3] | 依赖较多,效率略低 | --- ### 常见问题解决 1. **图片尺寸不一致**:需统一裁剪或缩放。 2. **编解码器报错**:尝试更换编解码器(如`mp4v`或`libx264`)。 3. **输出文件无法播放**:检查文件后缀与编解码器是否匹配。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值