OpenCV-Python学习笔记-模板匹配(matchTemplate)

模板匹配,通俗来讲就是利用小图来找大图,可以看作是一种简陋的目标检测方法。举例来说,对于以下两张图片(第一张为原图,第二章为样章),使用cv.matchTemplate()函数进行匹配,再使用cv.minMaxLoc()函数获得全局极值的位置和数值大小。

(1)result = cv.matchTemplate( image, templ, method[, result[, mask]] )

  • image:原图
  • templ:用于匹配的样章
  • method:原图与样章匹配效果的判别标准,参考链接:TemplateMatchModes,
    OpenCV-Python学习笔记-模板匹配(matchTemplate)_第1张图片
  • result:输出图片
  • mask:template的遮罩

(2)minVal, maxVal, minLoc, maxLoc = cv.minMaxLoc( src[, mask] )

各个参数、返回值的意思都很简洁明了,这里就不多解释了,注意传入图片必须是单通道图片,下面来看效果。
OpenCV-Python学习笔记-模板匹配(matchTemplate)_第2张图片 OpenCV-Python学习笔记-模板匹配(matchTemplate)_第3张图片

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)

OpenCV-Python学习笔记-模板匹配(matchTemplate)_第4张图片
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()

OpenCV-Python学习笔记-模板匹配(matchTemplate)_第5张图片

基本的知识到这里已经介绍完了,可以看出模板匹配的原理非常简单直接,对于物体尺度、形状的变化,并不具备鲁棒性,只能说是一种比较简陋的工具。

你可能感兴趣的:(OpenCV-Python学习笔记-模板匹配(matchTemplate))