目录
一、基础理论
1、作用与过程
所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是:按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。
2、原理
如果输入图像的大小为(WxH)
,而模板图像的大小为(wxh)
,则输出图像的大小将为(W-w + 1,H-h + 1)
。得到结果后,可以使用cv.minMaxLoc()函数查找最大/最小值在哪,将其作为矩形的左上角,并以(w,h)
作为矩形的宽度和高度。该矩形是您模板的区域。
3、函数matchTemplate
cv2.matchTemplate(image, templ, method, result=None, mask=None)
image: 输入图像
templ: 输入模板
method: 方法
TM_SQDIFF: 计算平方差, 计算出来的值越小, 越相关
TM_CCORR: 计算相关性, 计算出来的值越大, 越相关
TM_CCOEFF: 计算相关系数, 计算出来的值越大, 越相关
TM_SQDIFF_NORMED: 计算归一化平方不同, 计算出来的值越接近 0, 越相关
TM_CCORR_NORMED: 计算归一化相关性, 计算出来的值越接近 1, 越相关
TM_CCOEFF_NORMED: 计算归一化系数, 计算出来的值越接近 1, 越相关
二、代码
#模板匹配
import cv2
import os
# 1、读取图片 并转化为灰度图(不可以用彩图匹配)
img = cv2.imread("Resource/test11.jpg")
# 2、读取模板
template = cv2.imread("Resource/template.jpg")
w, h, c = template.shape #获得模板长宽
# 3、模板匹配
rectangle = cv2.matchTemplate(img, template, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(rectangle)
#最小值 最大值 最小值坐标 最大值坐标
# 4、获取匹配模块的左上角和右下角
top_left = max_loc #左上角
bottom_right = (top_left[0]+w, top_left[1]+h) #右下角
# 5、画矩形并显示
cv2.rectangle(img, top_left, bottom_right, (0,0,255), 2)
cv2.imshow("matching", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、效果
原图 模板:
匹配结果:
拓展∶模板匹配不适用于尺度变换、视角变换后的图像,这时我们就要使用关键点匹配算法,比较经典的关键点检测算法包括SIFT和SURF等,主要的思路是首先通过关键点检测算法获取模板和测试图片中的关键点﹔然后使用关键点匹配算法处理即可,这些关键点可以很好的处理尺度变化、视角变换、旋转变化、光照变化等,具有很好的不变性。
参考资料
https://iamarookie.blog.csdn.net/article/details/119096602
https://www.bilibili.com/video/BV1Fo4y1d7JL?p=39&spm_id_from=pageDriver