1 介绍
模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。OpenCV 为我们提供了函数:cv2.matchTemplate()。和2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像和与其对应的输入图像的子区域进行比较。OpenCV 提供了几种不同的比较方法(细节请看文档)。返回的结果是一个灰度图像,每一个像素值表示了此区域与模板的匹配
程度。
如果输入图像的大小是(WxH),模板的大小是(wxh),输出的结果的大小就是(W-w+1,H-h+1)。当你得到这幅图之后,就可以使用函数cv2.minMaxLoc() 来找到其中的最小值和最大值的位置了。第一个值为矩形左上角的点(位置),(w,h)为moban 模板矩形的宽和高。这个矩形就是找到的模板区域了。
2 代码
import cv2 as cv
import os
import numpy as np
def template_demo(tpl_imgPath,target_imgPath,save_path):
tpl =cv.imread(tpl_imgPath)
target = cv.imread(target_imgPath)
image_name = str(os.path.basename(target_imgPath).split('.')[0])
print(image_name)
methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED] #3种模板匹配方法
th, tw = tpl.shape[:2]
for md in methods:
# print(md)
result = cv.matchTemplate(target, tpl, md)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
if md == cv.TM_SQDIFF_NORMED:
tl = min_loc
else:
tl = max_loc
br = (tl[0]+tw, tl[1]+th) #br是矩形右下角的点的坐标
cv.rectangle(target, tl, br, (0, 0, 255), 2)
cv.imwrite(os.path.join(save_path,image_name + '_match_' + np.str(md) + '.jpg'),target)
def SJ_matchTemplate(tpl_imgPath,source_path,save_path):
if not os.path.exists(source_path):
return
if not os.path.exists(save_path):
os.makedirs(save_path)
for img in os.listdir(source_path):
if img.split('.')[1] == 'jpg':
template_demo(tpl_imgPath, os.path.join(source_path,img), save_path)
print(img)
if __name__ == '__main__':
# template_demo('18711-left-object.jpg','E:\\SJ\\19169-left.jpg','E:\\SJ_match\\')
SJ_matchTemplate('1.jpg',r'E:\\lvt_YBL\\jpg','E:\\lvt_YBL\\jpg_match')
3 效果