模板匹配
模板匹配常用于对象检测,且实现简单计算效率高。但如果输入图像中存在变化因素如旋转、缩放、视角变化等,模板匹配很容易失效
模板匹配原理:
1.匹配方式为模板 (a * b) 在原图像 (m * n) 上滑动 使用参数method中指定的方法,将模板与图像的所有重叠部分进行比较,最终得到的res大小为 ((m - a + 1) * (n - b + 1))
2.如果使用了含有归一化的匹配方法,那么模板匹配后就不再需要进行归一化处理,结果将在0和1的范围内,否则,需要使用 normalize 函数对结果进行归一化处理。
3.完成匹配后,要在使用cv.minMaxLoc()方法定位结果图像的全局最小值(图像中的最暗点)和全局最大值(图像中的最亮点)。如果使用的是平方差匹配,则最小值位置是最佳匹配位置,否则,则最大值位置是最佳匹配位置。最佳匹配位置即模板图片的左上角
Opencv API:
res = cv.matchTemplate(img, template, method)
img
:要进行模板匹配的图像
template
:模板(图像)
method
:模板匹配算法。
四种模板匹配算法:
前两种算法均为匹配结果值越低匹配度越高,后四种算法均为匹配结果值越高匹配度越高
1.平方差匹配(cv.TM_SQDIFF):以方差进行匹配。若完全匹配则结果为0。即匹配结果越小则匹配度越高
2.标准(归一化)平方差匹配(cv.TM_SQDIFF_NORMED):归一化后的平方差匹配,结果越接近0匹配度越高,越接近1匹配度越低
3.相关匹配(cv.TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
4.标准(归一化)相关匹配(cv.TM_CCORR_NORMED)
5.相关系数匹配(cv.TM_CCOEFF):将模板图像与其均值的相对值,与输入图像与其均值的相关值进行匹配,1表示完美的匹配,-1表示最差的匹配。
6.标准(归一化)相关系数匹配(cv.TM_CCOEFF_NORMED)
代码:
src = img.copy() #原图像
roi = temp.copy() #模板
#模板匹配
res = cv2.matchTemplate(src, roi, cv2.TM_CCORR_NORMED)
#返回模板匹配数据(先小后大,先数值后位置)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
#取匹配最佳位置(左上角)
top_left = max_loc
#取模板大小 .shape([:2])表示返回shape函数返回值的前两项 即长宽
roi_row, roi_col = roi.shape[:2]
#画矩形
cv2.rectangle(src, top_left, (top_left[0] + roi_col, top_left[1] + roi_row), (255, 0, 0), 5)
画矩形