ImageDataGenerator中调用adaptiveThreshold报CV_8UC1断言失败错误
问题原因
adaptiveThreshold要求输入为单通道8位无符号整型图像(即CV_8UC1格式),你单独调用函数时用cv2.imread(path, 0)读取的灰度图维度为(高度, 宽度),符合格式要求;但ImageDataGenerator加载灰度图时会自动保留通道维度,传入预处理函数的图像维度为(高度, 宽度, 1),无法被OpenCV函数识别,因此触发断言报错。
解决方法
修改自定义预处理函数,在调用OpenCV算子前去掉多余的通道维度,处理完成后再恢复通道维度适配模型输入要求即可:
import numpy as np # 如未导入numpy需先添加该行 def edge_detection(frame): minValue = 70 # 移除最后一维的通道占位,适配OpenCV函数输入要求 frame = frame.squeeze(axis=-1) blur = cv2.GaussianBlur(frame,(5,5),2) th3 = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,11,2) ret, res = cv2.threshold(th3, minValue, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) # 恢复通道维度,匹配模型输入的(64,64,1)格式要求 return res[..., np.newaxis]
修改后重新运行训练代码即可正常执行。
内容的提问来源于stack exchange,提问作者mahmoud magdy
相关产品推荐
相关产品推荐

