OpenCV matchTemplate断言失败求助:图像模板匹配报错排查
解决cv2.matchTemplate断言失败问题
针对你遇到的(-215:Assertion failed)错误,直接对应错误信息里的三个校验条件,逐个排查修复:
检查图像深度是否符合要求
OpenCV的matchTemplate只接受**8位无符号整数(CV_8U)或32位浮点数(CV_32F)**的图像。你可以用print(img.dtype, templ.dtype)查看当前数据类型,如果是float64(CV_64F)或其他类型,需要转换:- 转8位无符号:
img = img.astype(np.uint8),或者用cv2.convertScaleAbs(img)处理带负数的浮点图 - 转32位浮点:
img = img.astype(np.float32)
- 转8位无符号:
确保查询图与模板图的类型完全一致
这里的“type”是深度+通道数的组合,比如三通道8位图是CV_8UC3,单通道灰度图是CV_8UC1。哪怕深度对了,通道数不一样也会报错。用print(img.shape, templ.shape)确认通道数一致:- 如果一个是彩色一个是灰度,把彩色转灰度:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 如果通道数多了(比如带alpha通道的RGBA),去掉alpha通道:
img = img[..., :3]
- 如果一个是彩色一个是灰度,把彩色转灰度:
确认图像维度不超过2
matchTemplate不支持3D及以上的张量,比如如果图像带有批量维度(形状像(1, h, w, c)),需要用img = img.squeeze()去掉多余维度,确保最终形状是(h, w)(灰度)或(h, w, 3)(彩色)。额外验证:模板尺寸不能大于查询图
哪怕你统一了尺寸,也要确保模板的宽高都不超过查询图,否则同样会触发断言。可以加一行校验:assert templ.shape[0] <= img.shape[0] and templ.shape[1] <= img.shape[1], "模板尺寸超过查询图"
内容的提问来源于stack exchange,提问作者Expired_rice
相关产品推荐
相关产品推荐

