OpenCV模板匹配

Posted 金阳光测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV模板匹配相关的知识,希望对你有一定的参考价值。

对技术感兴趣可以加测试微信群:注明名字+公司。微信:15338817400


一、原理

滑动模板和比对图片对比,将匹配值记录在数组R中,我们使用函数 minMaxLoc 来定位在矩阵 R 中的最大值点 (或者最小值, 根据函数输入的匹配参数) 


OpenCV模板匹配


二、匹配算法

a.平方差匹配 method=CV_TM_SQDIFF

这类方法利用平方差来进行匹配,最好匹配为0,匹配越差,匹配值越大。


b.标准平方差匹配 method=CV_TM_SQDIFF_NORMED


c.相关匹配 method=CV_TM_CCORR

这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果。


d.标准相关匹配 method=CV_TM_CCORR_NORMED


e.相关匹配 method=CV_TM_CCOEFF

这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。


f.标准相关匹配 method=CV_TM_CCOEFF_NORMED

通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。

最好的办法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案。


三、实现 Demo

#coding=utf-8

import cv2

import numpy as np

from matplotlib import pyplot as plt

class imgMatcher:

   def __init__(self,sourceimg):

       self.sourceimg = sourceimg

   def find(self,templateimg,threshold,method):

       image = cv2.imread(self.sourceimg)

       template = cv2.imread(templateimg)

       template_height,template_width=template.shape[0],template.shape[1]

       result = cv2.matchTemplate(image,template,method)

       minVal,maxVal,minLoc,maxLoc=cv2.minMaxLoc(result)

       print(minLoc)

       print(maxLoc)

       #返回相似度

       similarity = cv2.minMaxLoc(result)[1]

      # if similarity < threshold:

           # 左上角点

       if (method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]):

           top_left = minLoc

       else:

           top_left = maxLoc

           # 右下角点

       bottom_right = (top_left[0] + template_width, top_left[1] + template_height)

       # 绘制方框

       cv2.rectangle(image, top_left, bottom_right, 255, 8)

       cv2.namedWindow("image")

       cv2.imshow('image', image)

       cv2.waitKey(0)

       cv2.imwrite("image/output.png",image)

       plt.subplot(121), plt.imshow(result, cmap='gray')

       plt.title('Matching Result'), plt.xticks([]), plt.yticks([])

       plt.subplot(122), plt.imshow(image, cmap='gray')

       plt.title('Detected Point'), plt.xticks([]), plt.yticks([])

       plt.suptitle(method)

       plt.show()

       return similarity

      # else:

          # return np.unravel_index(result.argmax(),result.shape)

if __name__=="__main__":

   matcher = imgMatcher("image/img.png")

   methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',

              'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

   for img in ['image/template.png']:

       print img,matcher.find(img,0.8,eval(methods[5]))


四、测试效果

边界较清晰的图片识别效果较好,比如淘宝的登录按钮:

OpenCV模板匹配

钱包的短信验证码输入框,颜色和周围差别较小:(img2 ,template2)

OpenCV模板匹配

比对方法和比对效果记录如下:

OpenCV模板匹配

几种模板匹配方法都没能得到准确的匹配,图片大小和原图片不同时,有问题。

OpenCV模板匹配


【修正】!!

【注意】

 /// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好

  if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )

    { matchLoc = minLoc; }

  else

    { matchLoc = maxLoc; }


【参考】

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html





长按二维码-识别图中二维码




加入免费公益分享的大家庭吧!


让我们一起学习,快速成长。



长按二维码-识别图中二维码



小编:Luna

以上是关于OpenCV模板匹配的主要内容,如果未能解决你的问题,请参考以下文章

opencv 中自带的模板匹配算法出处

使用Python,OpenCV进行模板匹配单对象多对象及多尺度模板匹配

OpenCV模板匹配 - 如何确定匹配模板的角度

使用OpenCV进行模板匹配(原图-模板图)

opencv 模板匹配,在图像中寻找物体

opencv —— matchTemplate 模板匹配