基础版笔记传送门:
python3+opencv学习笔记汇总目录(适合基础入门学习)
进阶版笔记目录链接:
python+opencv进阶版学习笔记目录(适合有一定基础)
模板匹配原理
模板匹配(TemplateMatching)就是在一幅图像中寻找和模板图像(template)最相似的区域,该方法原理简单计算速度快,能够应用于目标识别,目标跟踪等多个领域。
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
首先需要一个模板图像T(子图像)和一个待检测的图像(源图像S)
在待检测图像从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配度越高,两者相同的可能性越大。
缺点:模板图像尺寸和待检测图像尺寸问题。模板尺寸必须小于待检测图片尺寸。
匹配度量的方法有:
CV_TM_SQDIFF 平方差匹配法,最好的匹配为0,值越大匹配越差
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR 相关匹配法,采用乘法操作,数值越大表明匹配越好
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF 相关系数匹配法,最好的匹配为1,-1表示最差的匹配
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法
前面两种方法为越小的值表示越匹配,后四种方法值越大越匹配。
OpenCV模板匹配实现
cv2.matchTemplate(image, templ, method, result=None, mask=None)
image:待搜索图像
templ:模板图像
result:匹配结果,是一个矩阵
method:计算匹配程度的方法
cv2.minMaxLoc(src, mask=None)
src是一个矩阵。输入cv2.matchTemplate的返回值
函数功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。索引即位置坐标
import cv2 as cv
import numpy as np
def template_demo():
tpl = cv.imread("head.png")#模板
target = cv.imread("yangmi.jpg")#待检测图
cv.imshow("template image", tpl)
#cv.imshow("target image", target)
methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED]#归一化均方误差,归一化相关匹配,归一化相关系数
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);
cv.rectangle(target, tl, br, (0, 0, 255), 2)#在待检测图像上画矩形框。tl为矩形左上角,br为矩形右下角
cv.imshow("match-"+str(md), target)
#cv.imshow("match-" + np.str(md), result)#"match-" + np.str(md) 为窗口名
print("--------- Python OpenCV Tutorial ---------")
template_demo()
cv.waitKey(0)
cv.destroyAllWindows()
模板图像尺寸必须小于待检测图像尺寸。可以自己修改尺寸,使满足要求。
result结果样子
md=1,3,5
左上角为模板,其余三图为结果、
电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞再走,谢谢。