Python OpenCV matchTemplate处理16位图像报断言失败错误
报错原因
报错来自cv2.matchTemplate的前置参数校验,三个校验条件任意一个不满足就会触发该错误,结合使用16位图像的场景,核心原因如下:
- 该函数原生仅支持*8位无符号整数(CV_8U)和32位浮点数(CV_32F)*两种位深的输入,不支持16位整数(CV_16U/CV_16S)格式,直接传入16位图像会直接击穿位深校验项
- 额外两个可能触发同个报错的隐患:
- 待匹配大图和模板图的数据类型不统一,比如一个是8位、一个是32位,不满足类型一致要求
- 传入的图像数组维度超过2,比如误传入带批量维度的3维数组、多通道维度顺序错乱的高维数组
可行修复方案
按以下步骤调整代码即可解决问题:
- 提前定义模板宽高变量,避免后续变量未定义报错,在循环前加一行:
h, w = selected_image.shape[:2]
- 在调用
matchTemplate前,将大图和模板统一转换为函数支持的位深格式,两种方案二选一即可:- 方案1:转8位无符号格式,适合不需要保留16位全动态范围的场景:
# 归一化拉伸像素值到0-255区间转8位 img = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) selected_image = cv2.normalize(selected_image, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)- 方案2:转32位浮点格式,可完整保留16位图像的像素精度,匹配结果更准确:
img = img.astype("float32") selected_image = selected_image.astype("float32") - 转换完成后做两项简单校验,排除剩余隐患:
- 打印
img.dtype和selected_image.dtype,确认两者数据类型完全一致 - 打印
img.shape和selected_image.shape,确认两个数组都是二维结构(单通道图shape为(H,W),多通道图shape为(H,W,C)),不存在多余的维度
- 打印
注意:如果是多通道彩色图做模板匹配,必须保证大图和模板的通道数完全一致。
内容的提问来源于stack exchange,提问作者maximus
相关产品推荐
相关产品推荐

