1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配

参数说明: src目标图像, template模板,method使用什么指标做模板的匹配度指标

2. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)  # 找出矩阵中最大值和最小值,即其对应的(x, y)的位置
参数说明:min_val, max_val, min_loc, max_loc 分别表示最小值,最大值,即对应的位置, ret输入的矩阵

3. cv2.rectangle(img, (x, y), (x+w. y+h), (0, 0, 255), 2) 用于在图像上画出矩阵

参数说明:img表示图片,(x, y)表示矩阵左上角的位置,(x+w, y+h)表示矩阵右下角的位置, (0, 0, 255)表示颜色,2表示线条  

模板匹配:表示使用一个图像的模板,在一副主图上:从左到右,从上到下进行滑动,每次只滑动一个像素,最终结果的维度为(h - ht + 1, w - wt + 1),

h表示主图的长,ht表示模板的长, w表示主图的宽,wt表示模板的宽

对于结果的求法:这里使用几个指标:

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形) 

这是模板匹配中的6个指标

第一个指标,用于计算均分根误差,均方根误差越小,表示模板与主图的部分匹配度越高

第二个指标,表示相关性, 即dot(x, y), 相关性越大说明,模板与主图部分的匹配度越高

第三个指标, 表示相关性系数,即dot(x-x', y-y') x' 和 y’表示的是x的均值和y的均值,相关性系数越大,模板与主图部分的匹配度越高

下面三个指标的归一化表示,  /sqrt(dot(∑x^2 + ∑y^2)) , 下面是数学公式

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

 

单个目标的模板匹配

代码:

第一步:读入目标图片,读入模板图片,对目标图片和模板图片进行灰度化操作

第二步:使用cv2.matchtemplate(img, template, cv2.TM_CCOEFF_NORMED) 进行模板匹配,获得大量的ret结果
第三步:使用min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)  # 找出最大值数所在的位置

第四步:使用cv2.rectangle(original, max_loc, (max_loc[0] + w, max_loc[1] + h), (0, 0, 255), 2) 进行画图操作

第五步:我们对上述的方法进行循环,尝试各种方法所得到的结果

import cv2
import numpy as np
import matplotlib.pyplot as plt

original = cv2.imread('lena.jpg')
img = cv2.imread('lena.jpg', 0)
template = cv2.imread('face.jpg', 0)

h, w = template.shape[:2]

methods = ['cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCOEFF', 'cv2.TM_SQDIFF_NORMED', 'cv2.TM_SQDIFF',
           'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED']
ret = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)

draw_img = original.copy()
ret = cv2.rectangle(draw_img, max_loc, (max_loc[0]+w, max_loc[1]+h), (0, 0, 255), 2)
cv2.imshow('ret', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

for method in methods:
    draw_img = img.copy()
    op = eval(method)
    ret = cv2.matchTemplate(img, template, op)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)
    if method in ['cv2.TM_SQDIFF_NORMED', 'cv2.TM_SQDIFF']:
        loc = min_loc
    else:
        loc = max_loc
    rect = cv2.rectangle(draw_img, loc, (loc[0] + w, loc[1] + h), (0, 0, 255), 2)
    plt.subplot(121)
    plt.imshow(ret, cmap='gray')
    plt.title(method)
    plt.subplot(122)
    plt.imshow(rect, cmap='gray')
    plt.title(method)
    plt.show()

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

多目标匹配, 多目标匹配使用的是一个阈值,当大于这个阈值时,我们认为已经获得一个目标的匹配值

而使用cv2.matchTemplate匹配出的ret实际是一些上述指标的数值

代码:

第一步:读入图片,对目标图片和模板进行灰度化

第二步:匹配模板,获得ret

第三步:使用np.where(ret>0.8) 删选合适的位置,这个位置是(0, 2)即0表示竖的,2表示横着的

第四步:使用index[::-1]将位置进行调换,使用*index[::-1]使得矩阵发生拆分,使用zip进行两两组合

第五步:使用cv2.rectangle进行画多个矩阵

第六步:使用cv2.imshow展示图片

original = cv2.imread('mario.jpg')
img = cv2.imread('mario.jpg', 0)
template = cv2.imread('mario_coin.jpg', 0)
h, w = template.shape[:2]
ret = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)

index = np.where(ret > 0.8)

draw_img = original.copy()
for i in zip(*index[::-1]):
    rect = cv2.rectangle(draw_img, i, (i[0]+w, i[1]+h), (0, 0, 255), 1)

cv2.imshow('rect', np.hstack((original, rect)))
cv2.waitKey(0)
cv2.destroyAllWindows()

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)