模板匹配是一种在目标图像中寻找与模板图像最相似区域的方法。它通过计算模板图像与目标图像中各个子区域之间的相似度来确定模板在目标图像中的位置。
一、准备工作
需要的图片:
1.1 mario_coin.jpg
1.2 mario.jpg
二、代码
img_rgb = cv2.imread('mario.jpg')
# 将彩色图像 `img_rgb` 转换为灰度图像 `img_gray`,因为模板匹配通常在灰度图上进行。
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
# 以灰度模式读取名为 `mario_coin.jpg` 的模板图像,存储在 `template` 中。
template = cv2.imread('mario_coin.jpg', 0)
# 获取模板图像的高度 `h` 和宽度 `w`
h, w = template.shape[:2]
# 使用归一化相关系数匹配方法在灰度图像 `img_gray` 中查找模板图像 `template` 的位置,结果存储在 `res` 中。
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
# 设置匹配阈值为 0.8,表示匹配程度大于 80% 认为是匹配的
threshold = 0.8
# 取匹配程度大于%80的坐标
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]): # *号表示可选参数
bottom_right = (pt[0] + w, pt[1] + h)
# 在原彩色图像 `img_rgb` 上绘制红色矩形框,标记出匹配的位置。
cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)
cv2.imshow('img_rgb', img_rgb)
cv2.waitKey(0)
其中:
- TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
- TM_CCORR:计算相关性,计算出来的值越大,越相关
- TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
- TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
- TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
- TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关