Python香蕉成熟度检测代码运行时cv2.resize报错求助
香蕉成熟度检测代码报错修复方案
错误根因
cv2.error: 断言失败:!ssize.empty()报错的核心原因是cv2.resize()接收的输入图像为空值,该空值来源于cv2.imread()读取文件失败后返回的None,具体触发点有3个:
- 遍历目录时未过滤非图片文件,系统生成的缓存文件、子目录会被
os.listdir()纳入遍历范围,cv2无法解析这类非图片资源,返回None - 路径手动拼接错误,代码中直接用字符串相加拼接文件路径,缺少系统标准路径分隔符,导致文件找不到读取失败
- 存在无效冗余代码,
averagecolor函数中return后的代码不会执行,循环外的无意义imread调用还可能引发变量作用域冲突
修复步骤
1. 增加图片读取校验逻辑
每次调用cv2.imread()后判断返回值是否为None,直接跳过读取失败的文件
2. 统一用os.path.join()拼接路径
避免不同操作系统的路径分隔符差异导致的路径错误
3. 过滤非图片后缀文件
仅处理jpg、png等常见图片格式的文件
修复后完整代码
import cv2 import os import numpy as np def averagecolor(image): return np.mean(image, axis=(0, 1)) path = r"C:/Users/Rafael/Desktop/Banana_Ripeness-master/Data/" trainX = [] trainY = [] # 支持的图片后缀 ALLOWED_IMG_SUFFIX = ('.jpg', '.jpeg', '.png', '.bmp') for label in ('Unriped','Riped', 'No Banana Found'): print ("Loading training images for the label: "+label) label_path = os.path.join(path, label) # 遍历子文件夹 for filename in os.listdir(label_path): # 过滤非图片文件 if not filename.lower().endswith(ALLOWED_IMG_SUFFIX): continue img_path = os.path.join(label_path, filename) img = cv2.imread(img_path) # 校验读取结果 if img is None: print(f"跳过无法读取的文件:{img_path}") continue img_re = cv2.resize(img, (640,480)) img_features = averagecolor(img_re) trainX.append(img_features) trainY.append(label) Test = os.path.join(path, "Test") for filename in os.listdir(Test): if not filename.lower().endswith(ALLOWED_IMG_SUFFIX): continue test_img_path = os.path.join(Test, filename) test_img = cv2.imread(test_img_path) if test_img is None: print(f"跳过无法读取的测试文件:{test_img_path}") continue test_img_feat = averagecolor(test_img) calculated_distances = [] for i in trainX: calculated_distances.append(np.linalg.norm(test_img_feat-i)) prediction = trainY[np.argmin(calculated_distances)] print(f"{filename}:{prediction}")
额外优化建议
- 如果训练集的
No Banana Found类别中存放的是无香蕉的背景图,建议调整分类逻辑,先做香蕉目标检测再判断成熟度,准确率会更高 - 可以增加距离阈值判断,当最小距离超过阈值时统一返回
No Banana Found,避免误判
内容的提问来源于stack exchange,提问作者Rafael Salvino
相关产品推荐
相关产品推荐

