cv2.imwrite迭代数次后停止保存图片的技术问题
解决cv2.imwrite循环中前两次正常后停止保存的问题
问题根源
- 路径转义错误:Python中
\是转义字符,直接用f'{path}\{folder}'会导致部分路径解析异常,尤其是当文件夹名称包含特殊字符时,后续输出路径会失效。 - 未检查保存状态:
cv2.imwrite保存失败时仅返回False,不会主动抛出异常,无法直接得知保存失败的原因。 - 输出目录未预创建:如果
jpegs目录不存在,cv2.imwrite无法自动创建该目录,会直接保存失败。 - 窗口资源未释放:
cv2.imshow配合cv2.waitKey(0)会持续阻塞程序,且未主动销毁窗口,可能导致后续操作中OpenCV资源占用异常。
修复后的代码
import cv2 import os from os.path import join # 指定包含所有图片子目录的主目录 path = 'Folder_Name' # 提前创建输出目录 output_dir = join(path, 'jpegs') os.makedirs(output_dir, exist_ok=True) for folder in os.listdir(path): cpath = join(path, folder) # 跳过非文件夹项(避免主目录下的文件被误处理) if not os.path.isdir(cpath): continue print(f'Combining {folder}') images = [] for file in os.listdir(cpath): img_path = join(cpath, file) img = cv2.imread(img_path) if img is not None: images.append(img) # 跳过空图片列表的情况 if not images: print(f' No valid images in {folder}, skipped') continue vert = cv2.vconcat(images) # 优化窗口显示:显示后主动销毁窗口,避免资源占用 cv2.imshow('combined_image', vert) cv2.waitKey(1) # 改为等待1毫秒,或按需调整为等待按键 cv2.destroyWindow('combined_image') out_path = join(output_dir, f'{folder}.jpeg') # 检查保存状态 success = cv2.imwrite(out_path, vert) if success: print(f' Saved {folder} to {out_path}') else: print(f' Failed to save {folder} to {out_path}')
关键修复点
- 使用
os.path.join拼接路径,彻底避免转义字符问题 - 提前用
os.makedirs创建输出目录,设置exist_ok=True避免重复创建报错 - 增加对非文件夹项和空图片列表的判断,避免无效操作
- 主动销毁显示窗口,释放OpenCV资源
- 检查
cv2.imwrite的返回值,打印保存失败提示,便于排查问题
内容的提问来源于stack exchange,提问作者Anmaloy
相关产品推荐
相关产品推荐

