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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:30:42