OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配

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

OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配

导读

        模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。

        模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化、边缘检测等操作来生成二值化图像。但是:如果输入图像中存在变化的因素,包括旋转、缩放、视角变化等,模板匹配很容易就会失效。除非:输入图像的旋转、缩放、视角变化在恒定的情况下,模板匹配也可以完美发挥作用。

        你可能需要的文章:

  • OpenCV笔记:cv2.matchTemplate()、cv2.minMaxLoc() 、cv2.rectangle() 方法介绍
  • 关于:Python基础,爬虫,机器学习,常见异常和面试【篇】(专题汇总)

正文

        OpenCV 为我们提供了函数: cv2.matchTemplate() 用于实现模板匹配,并使用 cv2.minMaxLoc() 计算匹配结果。

        至于模板的匹配方法,这里不做详细介绍,需要的小伙伴可以查看:【导读】你可能需要的文章。

一、单模板匹配

1.1 图片准备

        之前的教程里,我一直匹配“脸部”这种特征明显的图形,所以本讲换一个思路,匹配更容易混淆的衣服部分。玩个游戏吧,大家可以看看下面的图片取自哪里,看看是你快,还是机器学习快。

  • 底图 image(博客首页的图),模板图片 templ 如下:

OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配

         注意:模板图片要从模板图片中截出来使用,如果二者分辨率差距太大,很容易匹配失败。

1.2 代码展示

# _*_coding:utf-8_*_
# 作者:   Java Punk
# 时间:   2022-10-09 14:49:45

import cv2 as cv2

# 单个模板匹配
def one_match(image, templ):
    img = cv2.imread(image)
    template = cv2.imread(templ)
    h, w = template.shape[:2]
    # 匹配模板
    res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    # 计算矩形左边
    top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    # 画矩形
    cv2.rectangle(img, top_left, bottom_right, (0, 0, 255), 5)
    # 展示结果
    cv2.imshow('img_rgb', img)
    cv2.waitKey(0)
    pass

if __name__ == '__main__':
    print("———————————————————— start ————————————————————\n")
    # 图片路径自己设置,下面是我本地的路径,记得替换!!!
    one_match('../img/test/guimie_03.jpg', '../img/test/guimie_04.jpg')
    print("———————————————————— end ————————————————————\n")

1.3 效果展示

        完美匹配到了,我的模板就是从这里接出来的。

OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配


二、多模板匹配

     上面的单模板匹配使用了函数 cv2.minMaxLoc() 输出结果,特点是:只会输出一个匹配系数最大值,无法给出所有匹配区域的位置信息。但是,有些情况下,要搜索的模板图像很有可能在输入图像内出现了多次,这时就需要找出多个匹配结果。

        多模板匹配引入了“匹配系数” - threshold,利用数学计算函数 numpy 删选出所有大于 threshold 的图形。

2.1 图片准备 

  • 模板图片 templ → 底图 image:

OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配

2.2 代码展示

# _*_coding:utf-8_*_
# 作者:   Java Punk
# 时间:   2022-10-09 14:49:45

import cv2 as cv2
import numpy as np

# 多个模板匹配
def more_match(image, templ):
    img = cv2.imread(image)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    template = cv2.imread(templ, 0)
    h, w = template.shape[:2]

    res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
    # 取匹配程度大于%90的坐标
    threshold = 0.9
    # np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序
    loc = np.where(res >= threshold)
    for pt in zip(*loc[::-1]):
        bottom_right = (pt[0] + w, pt[1] + h)
        cv2.rectangle(img, pt, bottom_right, (255, 0, 0), 1)
        print(pt, bottom_right)
    cv2.imshow('img_rgb', img)
    cv2.waitKey(0)
    pass

if __name__ == '__main__':
    print("———————————————————— start ————————————————————\n")
    # 图片路径自己设置,下面是我本地的路径,记得替换!!!
    more_match('../img/test/zhipai_03.jpg', '../img/test/zhipai_04.jpg')
    print("———————————————————— end ————————————————————\n")

2.3 效果展示

        要知道,即使是从原图上截取的图片,在做视觉匹配的时候有没有100%匹配的说法,只能是无限接近于100%。代码中 threshold = 0.9,即:90%以上匹配,尝试将匹配系数慢慢增大,看看会发生什么?

        注:为了让每个菱形有区别,我特意倾斜了一定角度拍摄了纸牌的照片,多少能展示出一点效果。

OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配

        当 threshold = 0.99 的时候,结果只有一个(的确就是我取的截图),即:输出最匹配的结果,在原理上与 函数 cv2.minMaxLoc() 有异曲同工之妙。文章来源地址https://www.toymoban.com/news/detail-454810.html


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

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

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

相关文章

  • opencv形状匹配(cv2.matchShape)

       

    2024年02月14日
    浏览(45)
  • opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

    矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以表示图像的中心、尺度

    2024年02月13日
    浏览(45)
  • 【跟官网学opencv-python】笔记1.3:opencv鼠标绘图 cv2.setMouseCallback()

    目录 前言 目标 函数详解 1、cv2.setMouseCallback()鼠标回调函数 2、鼠标事件简介 代码演示 ​编辑 应用演示 运行效果 参考 跟着官网学习才是基础入门的最佳选择,下文是opencv-python官网的学习记录及扩展! 学习函数cv2.setMouseCallback()并使用鼠标绘制不同图形(矩形、多边形等)

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

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

    2024年02月07日
    浏览(39)
  • python使用cv2获取截图中的匹配项目的中心位置

    在OpenCV中,cv2.matchTemplate()函数用于在大图中查找与小图(模板)匹配的区域,但并不会直接返回一个区域的box。 想要获取匹配区域的边界框(box),以及中心的位置,这样后续好进行自动化操作,。以下是一种方法: 首先,使用cv2.matchTemplate()函数找到匹配的区域。 然后,

    2024年02月09日
    浏览(37)
  • opencv图像旋转和翻转,cv2.flip,cv2.rotate

    目录 翻转图像 图像旋转         opencv中使用cv2.filp可以实现图像翻转 src:输入图像 flipCode:flipCode 一个标志来指定如何翻转数组;0表示上下翻转,正数表示左右翻转,负数表示上下左右都翻转。 dst:输出图像         下面代码对图像进行不同旋转。         opencv中使

    2024年02月15日
    浏览(79)
  • 【OpenCV】透视变换——cv2.getPerspectiveTransform()与cv2.warpPerspective()详解

    目录 什么是透视变换? 函数解析 cv2.getPerspectiveTransform() dst = warpPerspective() 代码实现 透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持

    2024年02月05日
    浏览(63)
  • opencv-python库 cv2 图形绘制 cv2.line()cv2.rectangle()cv2.circle()cv2.ellipse()cv2.polylines()cv2.putText

    cv2.line() 是 OpenCV 中的一个函数,用于在图像上绘制直线。这个函数需要指定图像、线的起点和终点坐标、线的颜色、线的宽度以及线的类型。 下面是 cv2.line() 函数的详细参数说明: 参数解释: 下面是一个使用 cv2.line() 绘制直线的简单示例: 在这个例子中,我们创建了一个

    2024年04月23日
    浏览(51)
  • 【OpenCV常用函数:颜色空间转换、阈值化】cv2.cvtColor()+cv2.threshold()

    对图像进行颜色空间的转换 对图像进行阈值化/二值化

    2024年02月13日
    浏览(67)
  • cv2(OpenCV)下载安装

     cv2对应库是OpenCV,官网下载链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 最好下载对应python版本的,通过pip命令安装可能会出现版本过高或者过低的问题,导致import cv2没问题,但是内部函数无法调用。 如果不想下载到本地,也可以通过命令安装: pip install opencv-python==4.5.

    2024年02月08日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包