? ? ? ? 模板匹配:当对象物的团以图像的形式表现时,根据该图案与一幅图像的各部分相似度判断其是否存在,并求得对象物在图像中位置的操作。
? ? ? ? 匹配方法:设检测对象的模板为t(x,y),令其中心与图像f(x,y)中的一点(i,j)重合,检测t(x,y)和图像重合部分之间的相似度,对图像中所有的点都进行这样的操作,根据相似度为最大或超过某一阈值来确定对象物是否存在,并求得对象物所在的位置。
? ? ? ? 粗精检索结合方法:首先进行粗检索,每隔若干个像素把模板和图像重叠,并计算匹配的尺度,从而求出对象物大致存在的范围。然后,仅在这个范围内,让模板每隔一个像素移动一次,根据求出的匹配尺度确定对象物所在的位置。这样,整体上计算模板匹配的次数减少,计算时间缩短,匹配速度提高。但是用这种方法具有漏掉图像中最适当位置的危险性。
? ? ? ?
# -*- codeing = utf-8 -*-
# @Time : 2021/9/10 12:31
# @Author : ZY
# @File : template matching.py
# Software : PyCharm
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
def match_demo():
tpl = cv.imread("picture path") # 模板
target = cv.imread("target picure path") # 目标
cv.imshow("template image", tpl) # 显示模板
cv.imshow("target image", target) # 显示目标
th, tw = tpl.shape[:2] # 模板的高、宽
result = cv.matchTemplate(target, tpl, cv.TM_SQDIFF_NORMED) # 计算每个位置匹配程度
# 平方差越小越匹配
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
tl = min_loc
# 以红色方框标出匹配区域
br = (tl[0]+tw, tl[1]+th)
cv.rectangle(target, tl, br, (0, 0, 255), 2)
cv.imshow("match_demo", target)
if __name__ == "__main__":
match_demo()
cv.waitKey(0)
cv.destroyAllWindows()
|