一.模板匹配
定义:让模板图像在输入图像中滑动逐像素遍历整个图像进行比较,查找出与模板图像最匹配的部分。
单目标匹配
定义:输入图像中只存在一个可能匹配结果
基本格式如下:
result = cv2.matchTemplate(image,templ,method)
- image为输入图像
- templ为模板图像,要小于image
- method为匹配方法,如下:
- cv2.TM_SQDIFF:以方差结果为依据进行匹配。完全匹配时结果为零,否则为很大的值
- cv2.TM_SQDIFF_NORMED:标准(归一化)方差匹配
- cv2.TM_CCORR:相关匹配,将输入图像与模板图像相乘,乘积越大匹配程度越高,乘积为0匹配程度最低
- cv2.TM_CCORR_NORMED:标准(归一化)相关匹配
- cv2.TM_CCOEFF:相关系数匹配,将输入图像于其均值的相关性和模板图像与其均值的相关值进行匹配。1为完美匹配,-1并表示糟糕匹配,0表示没有任何相关性。
- cv2.TM_CCOEFF_NORMED:标准(归一化)相关系数匹配
- result为返回结果。当匹配方法为前两个时,匹配结果值越小匹配度越高,越大匹配度越低。当为后四个时值越小说明匹配度越低,反之则说明匹配度越高。
opencv中的cv2.minMaxLoc()函数用于处理匹配结果
minVal,maxVal,minLocmmaxLoc=cv2.minMaxLoc(src)
- src是上面的matchTemplate()函数的返回结果
- minVal(maxVal)为src中的最小值(最大值),不存在时可以为NULL(空值)
- minLoc(MaxLoc)为src中最小值(最大值)的位置,不存在时可以为NULL
实例代码如下
import cv2
import numpy as np
import matplotlib. pyplot as plt
img1=cv2. imread( 'img/a.jpg')
cv2. imshow( ' original', img1)
temp=cv2. imread( 'img/b.jpg' )
cv2. imshow('template',temp)
img1gray=cv2. cvtColor(img1, cv2.COLOR_BGR2GRAY,dstCn=1)
tempgray=cv2. cvtColor(temp, cv2.COLOR_BGR2GRAY,dstCn=1)
h, w=tempgray.shape
res=cv2. matchTemplate(img1gray, tempgray,cv2.TM_SQDIFF)
plt.imshow(res,cmap = 'gray')
plt.title( 'Matching Result')
plt.axis('off')
plt. show()
min_val,max_val,min_loc,max_loc=cv2 .minMaxLoc(res)
top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img1,top_left, bottom_right,(255,0,0),2)
cv2. imshow(' Detected Range ',img1)
cv2. waitKey(0)
原图像:
模板图像:
匹配结果:
本次用了cv2.TM_SQDIFF作为匹配方法,所以值越小匹配度就越高。用灰度图像格式显示匹配结果,所以图中颜色越深的位置匹配度越高
模板图像在原图当中的位置:
多目标匹配
定义:输入图像中存在多个可能的匹配
以查找象棋为例,查找“卒象棋”:
模板图像:
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2. imread('img/d