使用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
相关产品推荐
相关产品推荐

