参考文献:
81.28-1讲解-模板匹配._哔哩哔哩_bilibili
模板匹配原理:
所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。
代码实现:
import cv2 as cv
from matplotlib import pyplot as plt# 1 图像馫模板读取
img = cv.imread('D:/1/identification_photo.jpg') # img:[h,w,c]
template=cv.imread('D:/1/identify.jpg')
h,w,c = template.shape
# 模板匹配
#TM_SQDIFF:平方差匹配;TM_CCORR:相关匹配;TM_CCOEFF:相关系数匹配;tm_sqdiff_normed:标准(归一化)平方差匹配。tm_ccorr_normed:标准(归一化)相关匹配。cv2.tm_ccoeff_normed:标准(归一化)相关系数匹配。
res =cv.matchTemplate(img,template, cv.TM_SQDIFF) #res维度为[img[0]-h, img[1]-w]
#2.2 返回图像中最匹配的位置,确定左上角的坐标,并将匹配位置绘制在图像上
# cv.minMaxLoc函数是 OpenCV 库中的一个函数,用于在一个矩阵(图像或数组)中找出全局的最大值和最小值,以及它们的位置。
min_val,max_val,min_loc,max_loc=cv.minMaxLoc(res) #todo:值得注意的是,这里输出的坐标是转换之后的,即(w,h)
# 使用平方差时最小值为最佳匹配位置
top_left = min_loc
# top_left = max_loc
bottom_right=(top_left[0]+w,top_left[1]+ h) #获取模板矩形的右下角坐标
cv.rectangle(img,top_left,bottom_right,(0,255,0),2) # 绘制矩形框
plt.imshow(img[:,:,::-1]) #将BGR转为RGB维度。
plt.title('result'),plt.xticks([]),plt.yticks([]) #设置标题
plt.show()
值得注意的两个点:
①cv.read直接读取的图像不用进行通道变换即可直接输入到cv.matchTemplate;
②cv.minMaxLoc函数返回的坐标是w,h与cv.read直接读取的hwc是不一样的,这里小心犯错。