【OpenCV】第十五章: 模板匹配

这篇具有很好参考价值的文章主要介绍了【OpenCV】第十五章: 模板匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第十五章: 模板匹配

模板匹配就是在给定的图片中查找和模板最相似的区域。
实现的方法是:将模板在图片上滑动(从左向右,从上向下),遍历所有滑窗,计算匹配度,将所有计算结果保存在一个矩阵种,并将矩阵中匹配度最高的值作为匹配结果。

一、单模板匹配

  • 1、匹配函数:result = cv2.matchTemplate(img, temp, method[, mask])
    img:要进行匹配的图像,必须是8位或者32位的浮点型图像
    tem:模板图像,尺寸要要小于原图,数据类型要和原图一样。
    method:匹配方法,也就是相似度计算方法,opencv提供了6种计算方法(主要是下面三种,另外三种是下面三种方式的归一化结果):
        平方差匹配cv2.TM_SQDIFF:以方差为依据进行匹配。如果完全匹配,匹配值为0,匹配值越大,越不匹配。
        相关匹配cv2.TM_CCORR:将模板图像和输入图像相乘,如果匹配值越大,表示匹配程度越高,如果乘积等于0,则表示完全不匹配。
        相关系数匹配cv2.TM_CCOEFF:将模板图像与其均值的相对值,和输入图像与其均值的相对值,进行匹配。1表示完美匹配,-1表示糟糕匹配,0表示没有任何相关性,是随机序列。
    函数返回值result是一个矩阵,大小是(W-w+1, H-h+1),其中W,H是原图的宽高,w,h是模板的宽高。矩阵里面的每个元素表示的是宽高和模型一样大小的矩形的顶点。

  • 2、查找最佳匹配的位置坐标:minval, maxval, minloc, maxloc = cv2.minMaxLoc(array[, mask])
    为什么要返回这么多对象,因为匹配函数cv2.matchTemplate()由于参数method设定的不同,其返回值值result中表示最佳匹配的结果不同,比如参数method=cv2.TM_SQDIFF,那我们想直到最佳匹配区域的坐标值就是return对象里面的最小值以及最小值对应的坐标值。如果method=cv2.TM_CCORR,或者cv2.TM_CCOEFF,那我们要找的最佳匹配区域就是return中的最大值及最大值对应的坐标值。
    minval1、maxval1是array中的最值,minloc1、maxloc1是array中最值对应的坐标点,但是这个坐标点是(列,行)的形式!!!

  • 3、用矩形框把最佳匹配区域框出来:img = cv2.rectangle(img, pt1, pt2, color, thickness)
    说明:pt1和pt2都是(列,行)的形式
     

    #例15.1 使用cv2.matchTemplate()函数的不同计算方法进行模板匹配        
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv2.imread(r'C:\Users\25584\Desktop\lena.bmp',0)  #img.shape返回(512, 512)
    template = cv2.imread(r'C:\Users\25584\Desktop\temp.bmp',0)  #template.shape返回(40, 200)
    
    result1 = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)  #result1.shape返回(473, 313)
    result2 = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)   #如果是cv2.TM_CCORR匹配出来的效果非常差!为什么????
    result3 = cv2.matchTemplate(img, template, cv2.TM_CCOEFF)
    
    minval1, maxval1, minloc1, maxloc1 = cv2.minMaxLoc(result1)   #minval1和result1.min()返回值一样
    minval2, maxval2, minloc2, maxloc2 = cv2.minMaxLoc(result2)  
    minval3, maxval3, minloc3, maxloc3 = cv2.minMaxLoc(result3)  
    
    img1 = img.copy()
    img1 = cv2.rectangle(img1, minloc1, (minloc1[0]+200, minloc1[1]+40), 255, 2)
    img2 = img.copy()
    img2 = cv2.rectangle(img2, maxloc2, (maxloc2[0]+200, maxloc2[1]+40), 255, 2)
    img3 = img.copy()
    img3 = cv2.rectangle(img3, maxloc3, (maxloc3[0]+200, maxloc3[1]+40), 255, 2)
    
    #可视化:
    plt.figure(figsize=(16,6))
    plt.subplot(161), plt.imshow(img, cmap='gray')    #原图
    plt.subplot(162), plt.imshow(template, cmap='gray')   #模板
    plt.subplot(163), plt.imshow(result1, cmap='gray')  #匹配的返回值
    plt.subplot(164), plt.imshow(img1, cmap='gray')  #
    plt.subplot(165), plt.imshow(img2, cmap='gray')  #
    plt.subplot(166), plt.imshow(img3, cmap='gray')  #
    plt.show()

    opencv 模板匹配中的相似度怎么求,opencv,学习,计算机视觉

    说明:模板匹配不适用尺度变换、视角变换后的图像!!!
    如果非要匹配,我们就要使用关键点匹配算法,比较经典的关键点检测算法包括SIFT和SURF等,主要思路是先通过关键点检测算法获取模板和检测图像中的关键点,然后使用关键点匹配算法处理。因为这些关键点可以很好的处理尺度变换、视角变换、旋转变化、光照变化等,具有很好的不变性。

    二、多模板匹配

    当要匹配的图像中有多个模板图像时,就是模板图像在原图中出现多次时,这时就要找出多个匹配结果。

  • 1、匹配函数:result = cv2.matchTemplate(img, temp, method[, mask])的返回对象result里面就会有多个符合条件的点
  • 2、找出result中的多个符合条件的点:因为result是一个二维array,在二维array中值大于阈值0.99(因为我们这里假设匹配方法是cv2.TM_CCOEFF_NORMED,是相关系数匹配),所以要用:loc = np.where(result>=0.99),这样就把result里面大于0.99的值的横纵坐标找出来了。loc返回值是一个元组,元组的第一个元素是一个array,这个array是索引出来的所有符合条件的点的横坐标索引,元组的第二个元素是所有符合条件的点的列索引。
  • 3、用for循环画图。循环的时候是循环zip(*loc),这样循环的时候就是把loc中的每个元素对应位置进行遍历。
    但是这里要注意的是画图的时候是(列,行)索引来画的,但是循环的时候循环的是最值的(行,列)坐标,所以画图的时候要行列翻转一下。
    #例15.2 练习多模板匹配        
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv2.imread(r'C:\Users\25584\Desktop\lena4.bmp',0)  #img.shape返回(540, 700)
    template = cv2.imread(r'C:\Users\25584\Desktop\lena4Temp.bmp',0)  #template.shape返回(51, 103)
    
    result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)  #result.shape返回(490, 598)
    plt.figure(figsize=(16,8))
    plt.subplot(131), plt.imshow(img, cmap='gray')    #原图
    plt.subplot(132), plt.imshow(template, cmap='gray')   #模板
    plt.subplot(133), plt.imshow(result, cmap='gray')  #匹配的返回值
    
    loc = np.where(result >= 0.99)
    
    img1 = img.copy()
    for pt in zip(*loc):
        cv2.rectangle(img1, pt[::-1], (pt[::-1][0]+103, pt[::-1][1]+51), 255,1)
    
    #可视化:
    plt.figure(figsize=(16,8))
    plt.imshow(img1, cmap='gray')  #
    plt.show()

    opencv 模板匹配中的相似度怎么求,opencv,学习,计算机视觉文章来源地址https://www.toymoban.com/news/detail-787844.html

到了这里,关于【OpenCV】第十五章: 模板匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV 模板匹配 matchTemplate

    模板匹配是一项在一副图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块(模板)同时对比相似度,来对模板和输入图像进行匹配的一种方法。 应用: (1)目标查找定位 (2)运动物体跟踪 image:待搜

    2024年02月04日
    浏览(62)
  • OpenCV(十九):模板匹配

    1.模板匹配:      OpenCV提供了一个模板匹配函数,用于在图像中寻找给定模板的匹配位置。 2.图像模板匹配函数matchTemplate  void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask = noArray() ); image:待模板匹配的原图像,图像数据类型为CV 8U和CV 32F两者中

    2024年02月09日
    浏览(43)
  • 用OpenCV进行模板匹配

    今天我们来研究一种传统图像处理领域中对象检测和跟踪不可或缺的方法——模板匹配,其主要目的是为了在图像上找到我们需要的图案,这听起来十分令人兴奋。 所以,事不宜迟,让我们直接开始吧! 模板匹配的算法的核心十分简单:它将模板与源图像中的每个部分进行

    2024年02月10日
    浏览(44)
  • Opencv——图像模板匹配

    什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等。 模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。 参数:(img: 原始图像、

    2024年02月16日
    浏览(41)
  • 008 OpenCV matchTemplate 模板匹配

    目录 一、环境 二、模板匹配算法原理 三、代码演示 本文使用环境为: Windows10 Python 3.9.17 opencv-python 4.8.0.74 cv.matchTemplate 是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景是在图像处理、计算机视觉和模式识别等领域。 算法原理: cv.matchTempl

    2024年02月05日
    浏览(40)
  • OpenCV(11):模板匹配实例讲解

    在OpenCV中,模板匹配是一种图像处理技术,用于在一个大的图像中查找和定位一个小的目标图像(也称为模板)。 通俗而言,就是通过一张图片找到和另一张图片相似的部分。 从此章开始,opencv系列所有的之后更新的博客都会更注重实际应用,而不是仅仅简单讲解一个小方

    2024年02月04日
    浏览(38)
  • OPENCV C++(十二)模板匹配

    正常模板匹配函数  这里0代表的是方法,一般默认为0就ok  img是输入图像 templatee是模板 resultmat是输出 对于输出的说明: 就是说result图像中的每一个点的值代表了一次相似度比较结果。  如图可知,模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算

    2024年02月13日
    浏览(41)
  • opencv 多角度模板匹配

    总结一下实现多角度模板匹配踩的坑 一 、多角度匹配涉及到要使用mask,首先opencv matchTemplateMask自带的源码如下: 可以看到使用用了四次dft来计算卷积,目标图像要与mask卷三次,来计算目标图像在模板区域内的和,平方和。其中最后一次CCorr(I, mask2)可以省略掉,它跟CCorr(I

    2024年02月07日
    浏览(44)
  • 图像模板匹配 opencv c++实现

    用T表示模板图像,I表示待匹配图像,切模板图像的宽为w高为h,用R表示匹配结果,匹配过程如下图所示: 1、平方差匹配算法method=TM_SQDIFF 这类方法利用平法差来进行匹配,最好匹配为0,而若匹配越差,匹配值则越大 2、归一化平方差匹配法method=TM_SQDIFF_NORMED 3、相关匹配法

    2024年02月04日
    浏览(46)
  • OpenCV自学笔记十八:模板匹配

    模板匹配是一种在图像中寻找指定模式的方法。OpenCV库提供了用于模板匹配的函数,可以帮助我们在图像中定位和识别特定的模式。下面是模板匹配的基础原理和一个示例: 模板匹配通过在待匹配图像上滑动一个固定大小的模板图像,并计算模板与图像之间的相似度来寻找匹

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包