发布于2026-06-30 阅读(0)
扫一扫,手机访问
使用 OpenCV 做图像处理时,最让人头疼的问题之一就是:cv2.imread() 读出来的图片是空(None),程序直接报错 AttributeError: 'NoneType' object has no attribute 'shape'。

先用两行代码快速判断,读出来的对象是不是 None:
import cv2
img = cv2.imread("test.jpg")
print(img) # 输出 None 就是读取失败
print(type(img)) # 代表读取失败
只要输出 None,就说明 图片路径错误 / 权限不足 / 格式不支持 / 图片损坏,下面逐个排查!
cv2.imread() 的相对路径是相对于「当前运行 Python 的工作目录」,不是你写代码的 .py 文件所在目录!
错误示例:
D:/project/test.pyD:/project/img/test.jpgD:/img = cv2.imread("img/test.jpg") 就会失败解决方法:
# Windows 绝对路径
img = cv2.imread("D:/project/img/test.jpg")
# 或者用反斜杠,但必须加 r 转义
img = cv2.imread(r"D:projectimgtest.jpg")
import cv2 import os # 获取当前 .py 文件的绝对路径 base_path = os.path.dirname(os.path.abspath(__file__)) # 拼接图片路径 img_path = os.path.join(base_path, "img", "test.jpg") img = cv2.imread(img_path)
OpenCV 默认不支持中文路径!这是超级大坑!
错误:
img = cv2.imread("D:/测试文件夹/图片.jpg") # 直接返回 None
解决方法(万能方案):
import cv2
import numpy as np
# 先用 imdecode 读取,支持中文路径
def cv_imread(file_path):
# 读取图片字节数据
cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
return cv_img
# 使用这个函数代替 cv2.imread
img = cv_imread("D:/测试文件夹/图片.jpg")
test .jpg(多了空格)、tes.jpg(拼写错误).png 写成 .pnj、.jpg 写成 .jpeg解决:重新下载 / 替换正常图片
OpenCV 支持:jpg、jpeg、png、bmp、tiff 等常见格式
不支持:
解决:
PIL 先转成 PNG/JPG 再读pyheif 库转换Linux/macOS 赋权命令:
chmod 644 你的图片路径
如果所有路径、图片都正常,还是读不出来,大概率是 OpenCV 装错了:
常见错误安装:
# 不推荐,缺少依赖库 pip install opencv-python
推荐安装:
# 完整版本,包含所有依赖(解决大部分底层读取失败) pip install opencv-contrib-python
安装后重启 Python 环境!
把这段代码放到你的项目里,自动检测所有错误原因:
import cv2
import os
def check_image_read(img_path):
# 1. 判断文件是否存在
if not os.path.exists(img_path):
print("错误:文件不存在!")
return None
# 2. 判断是否是文件
if not os.path.isfile(img_path):
print("错误:这不是一个文件!")
return None
# 3. 读取图片
img = cv2.imread(img_path)
# 4. 判断是否读取成功
if img is None:
print("错误:cv2.imread 读取失败!")
print("可能原因:中文路径/图片损坏/格式不支持/权限不足")
# 尝试用中文路径兼容方案读取
try:
import numpy as np
img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_COLOR)
if img is not None:
print("已自动用中文路径方案修复!")
except:
pass
else:
print("图片读取成功!图片形状:", img.shape)
return img
# 测试
if __name__ == "__main__":
# 替换成你的图片路径
image_path = "test.jpg"
check_image_read(image_path)
opencv-contrib-pythoncv2.imread() 返回 None 90% 是路径问题,优先用绝对路径cv2.imdecode() 方案
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8