模板匹配,通俗来讲就是利用小图
来找大图
,可以看作是一种简陋的目标检测方法。举例来说,对于以下两张图片(第一张为原图,第二章为样章),使用cv.matchTemplate()
函数进行匹配,再使用cv.minMaxLoc()
函数获得全局极值的位置和数值大小。
(1)result = cv.matchTemplate( image, templ, method[, result[, mask]] )
(2)minVal, maxVal, minLoc, maxLoc = cv.minMaxLoc( src[, mask] )
各个参数、返回值的意思都很简洁明了,这里就不多解释了,注意传入图片必须是单通道
图片,下面来看效果。
res = cv.matchTemplate(img,template,cv.TM_CCOEFF_NORMED)
minval,maxval,minloc,maxloc = cv.minMaxLoc(res)
print(minval,maxval,minloc,maxloc)
plt.imshow(res,'gray')
plt.show()
通过某些判别标准(函数中第三个参数
),来判断原图各位置与template匹配的效果,针对以上例子,输出效果如下:
-0.42863041162490845 0.9992316961288452 (146, 104) (107, 89)
res图中像素值越大的点表示匹配的效果越好,直观来看就是越亮的位置,匹配效果越好。注意样章移动是以样章的左上角
点为基准,找到极值点后,可以使用cv.rectangle()函数绘制出样章的轮廓,图中黑色矩形框表示最佳
匹配位置,白色矩形框表示最差
匹配位置。
h,w = template.shape[:2]
#最大值
max_lefttop = maxloc
max_rightbottom = (max_lefttop[0]+w,max_lefttop[1]+h)
#最小值
min_lefttop = minloc
min_rightbottom = (min_lefttop[0]+w,min_lefttop[1]+h)
#绘制矩形框
cv.rectangle(img_big,min_lefttop,min_rightbottom,255,2)
cv.rectangle(img_big,max_lefttop,max_rightbottom,0,2)
plt.imshow(img_big,'gray')
plt.show()
基本的知识到这里已经介绍完了,可以看出模板匹配的原理非常简单直接,对于物体尺度、形状的变化,并不具备鲁棒性,只能说是一种比较简陋的工具。