cv2.imread读取jpg失败报NoneType无shape属性错误求助
问题根因
从报错日志里的路径dataset/images/"2007_000027.jpg可以直接定位问题:你从csv拆分得到的filename变量自带多余的前导双引号,拼接出的文件路径实际不存在,cv2.imread读取失败会返回None,后续访问None的.shape属性就触发了属性错误。
修复方案
- 清理读取到的文件名字段:拆分每行内容后,先对文件名做首尾空白、多余引号的剔除处理,不要直接用原始拆分结果拼接路径。
- 增加合法性校验:在读取图片前先校验路径有效性,读取后判断返回结果是否为空,避免无意义的崩溃。
- (可选)使用Python标准库
csv模块读取标注文件,替代手动按空格拆分的逻辑,避免因字段带引号、多空格等格式问题拆分出错。
修复后的核心代码片段:
//config file BASE_PATH = "dataset" IMAGES_PATH = os.path.sep.join([BASE_PATH, "images"]) ANNOTS_PATH = os.path.sep.join([BASE_PATH, "bboxes.csv"]) //main file import csv import os import cv2 data = [] targets = [] filenames = [] # 用csv模块读取,自动处理引号、分隔符问题 with open(config.ANNOTS_PATH, 'r') as f: reader = csv.reader(f, delimiter=' ') for row in reader: # 跳过空行 if not row: continue filename, startX, startY, endX, endY = row # 清理文件名首尾的空白、多余引号 filename = filename.strip().strip('"') suffix = ".jpg" imagePath = os.path.sep.join([config.IMAGES_PATH, filename+suffix]) # 校验路径是否存在 if not os.path.exists(imagePath): print(f"路径不存在:{imagePath}") continue image = cv2.imread(imagePath) # 校验图片是否读取成功 if image is None: print(f"图片读取失败:{imagePath}") continue (h, w) = image.shape[:2]
临时快速修复如果不想改读取逻辑,也可以直接在原来的filename赋值后加一行
filename = filename.replace('"', ''),把所有双引号替换掉即可,但长期还是建议用标准csv模块读取标注文件,减少格式兼容问题。
内容的提问来源于stack exchange,提问作者Silentcow
相关产品推荐
相关产品推荐

