单目标匹配是指输入图像中只存在一个可能匹配结果。
OpenCV中的cv2.matchTemplate()函数用于执行匹配操作,其基本格式如下。
result = cv2.matchTemplate(image,templ,method)
参数说明如下。
image为输入图像,必须是8位或32位浮点类型。
templ为模板图像,不能大于image,且数据类型要和image相同。
method为匹配方法,匹配方法不同,返回结果会有所不同。可用的匹配方法如下。
cv2.TM_SQDIFF:以方差结果为依据进行匹配。完全匹配时结果为0,否则为一个很大的值。
cv2.TM_SQDIFF_NORMED:标准(归一化)方差匹配。
cv2.TM_CCORR:相关匹配,将输入图像与模板图像相乘,乘积越大匹配度越高,乘积为0时匹配度最低。
cv2.TM_CCORR_NORMED:标准(归一化)相关匹配。
cv2.TM_CCOEFF:相关系数匹配,将输入图像与其均值的相关值和模板图像与其均值的相关值进行匹配;结果为1表示完美匹配,-1表示糟糕匹配,0表示没有任何相关性。
cv2.TM_CCOEFF_NORMED:标准(归一化)相关系数匹配。
result为返回结果,它是一个numpy.ndarray对象。若输入图像的大小为W×H,模板图像大小为w×h,则result的大小为(W-w+1)×(H-h+1),其中的每个值都表示对应位置的匹配结果。当匹配方法为cv2.TM_SQDIFF或cv2.TM_SQDIFF_NORMED时,匹配结果值越小说明匹配度越高,反之则说明匹配度越低。当匹配方法为cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_CCOEFF或cv2.TM_CCOEFF_NORMED时,匹配结果值越小说明匹配度越低,反之则说明匹配度越高。
OpenCV中的cv2.minMaxLoc()函数用于处理匹配结果,其基本格式如下。
minVal,maxVal,minLoc,maxLoc=cv2.minMaxLoc(src)
参数说明如下。
src为cv2.matchTemplate()函数的返回结果。
minVal为src中的最小值,不存在时可以为NULL(空值)。
maxVal为src中的最大值,不存在时可以为NULL。
minLoc为src中最小值的位置,不存在时可以为NULL。
maxLoc为src中最大值的位置,不存在时可以为NULL。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('bee.jpg') #打开输入图像,默认为BGR格式
cv2.imshow('original',img1)
temp=cv2.imread('template.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)