构建眼睛颜色识别神经网络时转换RGB遇ranges参数缺失错误
解决OpenCV转换图片RGB时的"Required argument 'ranges' (pos 2) not found"错误
你遇到的这个错误根源在于错误地使用了cv2.UMat构造函数——它不能直接接收图片路径作为参数,而是需要传入已有的图像矩阵或者指定ranges参数,这就是报错提示找不到'ranges'的原因。
错误代码的核心问题
你这段代码里的关键错误行:
img_array = cv2.cvtColor(cv2.UMat(os.path.join(path,img)), cv2.COLOR_BGR2RGB)
cv2.UMat()的作用是创建用于OpenCV异构计算的矩阵对象,但它不是用来读取图片的工具函数。要加载图片,你需要先用cv2.imread()函数读取得到常规的Mat对象,再根据需求转为UMat(或者直接处理)。
修正后的完整代码
下面是修复后的代码,同时优化了容错性:
import os import cv2 import matplotlib.pyplot as plt DATADIR = "/content/drive/My Drive/ForpythonEyes" CATEGORIES = ["BlueEyes", "BrawnEyes"] for category in CATEGORIES: path = os.path.join(DATADIR, category) # 遍历路径下的文件,跳过非图片文件(可选但推荐) for img_name in os.listdir(path): img_path = os.path.join(path, img_name) # 第一步:用cv2.imread读取图片,得到BGR格式的矩阵 img_bgr = cv2.imread(img_path) # 检查图片是否成功读取,避免损坏文件导致报错 if img_bgr is None: print(f"无法读取图片:{img_path}") continue # 第二步:将BGR格式转换为RGB格式 img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # 显示图片 plt.imshow(img_rgb) plt.show() break # 保留你原有的只处理第一个类别的逻辑
关键修正点说明
- 用
cv2.imread()读取图片:这是OpenCV加载图片的标准方式,返回的是BGR顺序的图像矩阵(OpenCV默认以BGR格式读取图片)。 - 增加图片读取检查:避免因损坏文件、非图片文件导致后续代码崩溃。
- 正确转换RGB格式:先读取到BGR矩阵,再用
cv2.cvtColor()转为RGB,这样plt.imshow()才能正确渲染颜色(matplotlib默认使用RGB顺序显示图像)。
如果你的场景确实需要使用UMat(比如利用GPU加速计算),可以在读取图片后再转换为UMat:
img_bgr_umat = cv2.UMat(img_bgr) img_rgb_umat = cv2.cvtColor(img_bgr_umat, cv2.COLOR_BGR2RGB)
内容的提问来源于stack exchange,提问作者Владимир Агишев
相关产品推荐
相关产品推荐

