You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV将多级文件夹下PNG帧转视频时出现IndexError如何解决?

报错触发原因
  • 核心触发点:代码在遍历目录时没有判断当前目录是否存在PNG图片,当遍历到无PNG文件的目录时,筛选得到的images列表为空,直接访问images[0]就触发了索引越界错误。
  • 原有代码还存在多个逻辑错误:
    • 嵌套两层os.walk属于冗余逻辑,外层遍历结果完全没有被利用,内层每次都会从头遍历整个根目录,重复处理文件夹,执行效率极低
    • cv2.destroyAllWindows()、video.release()的缩进错误,被写在了逐帧写入的循环内部,写入第一帧后就直接释放了视频对象,最终生成的视频只会有1帧
    • 生成的视频文件名没有绑定路径,默认会保存在Python脚本的工作目录,不会对应存放在图片所在的文件夹,还会出现重名覆盖的问题
    • 原有len(videoname) >40的筛选条件没有和后续生成视频的逻辑绑定,会给所有含PNG的目录生成视频,不符合你的初始筛选要求
修复后可正常运行的代码
import os
import cv2

root = r'C:\Users\sboroghina\Documents\_projects\json_compare'

# 一层遍历即可,不需要嵌套os.walk
for path, dirs, files in os.walk(root, topdown=False):
    # 筛选当前目录下的所有PNG文件
    images = [f for f in files if f.endswith('.png')]
    # 无PNG文件的目录直接跳过,避免索引越界
    if not images:
        continue
    # 取当前目录名作为视频名,也可以根据你的需求调整命名规则
    dir_name = os.path.basename(path)
    # 如果你需要保留原来的文件名长度筛选,取消下面两行的注释即可
    # if len(dir_name) <=40:
    #     continue
    # 视频文件保存在对应图片的目录下,避免重名覆盖
    video_path = os.path.join(path, f"{dir_name}.avi")
    # 读取第一张图获取尺寸
    first_frame = cv2.imread(os.path.join(path, images[0]))
    height, width, layers = first_frame.shape
    # 初始化视频写入器
    video = cv2.VideoWriter(video_path, 0, 30, (width, height))
    # 逐帧写入
    for img_name in images:
        img = cv2.imread(os.path.join(path, img_name))
        video.write(img)
    # 所有帧写完后再释放资源
    cv2.destroyAllWindows()
    video.release()

内容的提问来源于stack exchange,提问作者bsilvian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:05