当前位置: 首页 > news >正文

15. 模板匹配

一、什么是模板匹配

  模板匹配 是指当前图像 A 内寻找与图像 B 最相似的部分,一般将图像 A 称为 输入图像,将图像 B 称为 模板图像。模板匹配的操作方法是将模板图像 B 在输入图像 A 上滑动,遍历所有像素以完成匹配。

  我们可以在终端中使用 pip 安装 OpenCV 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

  • 阿里云 https://mirrors.aliyun.com/pypi/simple
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
  • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
  • 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple

  在 OpenCV 中,我们可以使用 cv2.matchTemplate() 函数实现模板匹配。该函数的定义如下:

cv2.matchTemplate(image: cv2.typing.MatLike, templ: cv2.typing.MatLike, method: int, result: cv2.typing.MatLike | None = ..., mask: cv2.typing.MatLike | None = ...) -> cv2.typing.MatLike: ...

  其中,参数 image原始图像,该图像必须是 8 位图像或者 32 位图像。参数 templ模板图像。它的尺寸必须小于或等于原始图像,并且与原始图像具有同样的类型。参数 method匹配方法。它必须和模板图像具有相同的大小。参数 reset每个位置的比较结果组合所构成的一个结果集,类型是单通道 32 位浮点型。参数 mask模板图像掩膜

  参数 method匹配方法,它的常用取值如下:

  • cv2.TM_SQDIFF以方差为依据进行匹配。若完全匹配,则结果为零。若不匹配,则会得到一个很大的值。
  • cv2.TM_SQDIFF_NORMED标准(归一化)平方差匹配
  • cv2.TM_CCORR相关匹配,这类方法将模板图像与输入图像相乘,如果乘积较大,表示匹配程度较高,如果乘积为 0,则表示匹配效果较差。
  • cv2.TM_CCORR_NORMED标准(归一化)相关匹配
  • cv2.TM_CCOEFF相关系数匹配,这类方法将模板图像与其均值的相对值,和输入图像与其均值的相关值进行匹配,1 表示 完美匹配-1 表示 糟糕的匹配,0 表示 没有任何相关性(随机序列)。
  • cv2.TM_CCOEFF_NORMED标准(归一化)相关系数匹配

  在进行模板匹配时,模板在原始图像内遍历。在水平方向上遍历的起始坐标是原始图像左数第 1 个像素值。最后一次比较是模板图像位于原始图像的最右侧时,此时其左上角像素点所在的位置是 W - w + 1。在垂直方向上遍历的起始坐标从原始图像顶端的第 1 个像素开始,最后一次比较是当模板图像位于原始图像的最下端时,此时其左上角像素点所在位置是 H - h + 1

  如果原始图像尺寸是 W X H,模板的尺寸是 w - h,则返回值的大小为 (W - w + 1) * (H - h + 1)。也就是说,模板图像要在输入图像内比较 (W - W + 1) * (H - h + 1) 次。

  在查找最佳匹配时,首先要确定使用的是何种 method,然后再确定到底是查找最大值还是最小值。在 OpenCV 中,提供了 cv2.minMaxLoc() 函数用来 查找最值

cv2.minMaxLoc(src: cv2.typing.MatLike, mask: cv2.typing.MatLike | None = ...) -> tuple[float, float, cv2.typing.Point, cv2.typing.Point]: ...

  参数 src单通道数组。参数 mask图像掩码。该函数返回一个元组,元组的第一个值是 最小值,第二个值是 最大值,第三个参数是 最小值的位置,第四个值是 最大值的位置

import sys
import cv2if __name__ == '__main__':image = cv2.imread("assets/images/lena.png")template = cv2.imread("assets/images/11.png")if image is None or template is None:print("加载图片失败")sys.exit(0)result = cv2.matchTemplate(image, template, cv2.TM_SQDIFF)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)cv2.rectangle(image, min_loc, (min_loc[0] + template.shape[1], min_loc[1] + template.shape[0]), (0, 255, 0), 2)cv2.imshow("Result", image)cv2.waitKey(0)cv2.destroyAllWindows()sys.exit(0)

二、多模板匹配

  cv2.minMaxLoc() 函数只能找出最值,无法给出所有匹配区域的位置信息。所以,想要匹配多个结果,我们需要利用阈值进行处理。我们可以使用 cv2.where() 函数 获取模板匹配位置的集合。对于不同的输入,其返回的值是不同的。

  • 当输入(参数)是一维数组时,返回值时一维数组,返回的是匹配值的位置(索引)。
  • 当输入(参数)是二维数组时,返回的是匹配值的行、列位置索引。此时,有两组索引,分别表示匹配值的行和列。

  在获取数组之后,我们需要在循环中获取匹配值的索引。这里,我们使用 zip() 函数将对象中对应的元素打包成一个个元组。

import sys
import cv2
import numpy as npif __name__ == '__main__':image = cv2.imread("assets/images/mario.jpg")template = cv2.imread("assets/images/coin.png")if image is None or template is None:print("加载图片失败")sys.exit(0)h, w = template.shape[:2]result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)# 设置阈值,认为相关系数大于0.8就匹配到了threshold = 0.8# 分别返回y轴和x轴的索引locs = np.where(result >= threshold)for loc in zip(*locs[::-1]):bottom_right = loc[0] + w, loc[1] + hcv2.rectangle(image, loc, bottom_right, (0, 0, 255), 1)cv2.imshow("Result", image)cv2.waitKey(0)cv2.destroyAllWindows()sys.exit(0)
http://www.jsqmd.com/news/201348/

相关文章:

  • 零基础入门海外修图软件开发
  • 游戏开发者必看:彻底解决VCRUNTIME140.DLL报错方案
  • Windows超级管理器:传统工具与现代工具的对比
  • 传统扫描 vs AI扫描:RSA检测效率对比
  • Cursor技术文档:前端开发的“断舍离”高效协作指南
  • AI如何快速生成十二生肖买马网站代码
  • IDEA社区版vs专业版:免费工具的高效使用技巧
  • Katalon Studio的安装
  • Cursor vs 传统IDE:开发效率对比实测
  • Katalon Studio快速入门指南
  • 富文本编辑基础核心
  • 第 483 场周赛Q2——3799. 单词方块 II
  • 1小时验证创意:IP检测工具原型开发实录
  • 计算机深度学习毕设实战-卷神经网络基于深度学习训练识别常见水果
  • 第 483 场周赛Q1——3798. 最大的偶数
  • HSLCOMMUNICATION:AI如何革新通信协议开发
  • MySQL 用户与权限管理全攻略:从基础操作到生产级安全实践
  • Claude Code
  • 深度学习计算机毕设之基于python的深度学习训练识别常见水果机器学习
  • 2026年正规的AI标书系统,A1标书平台,标书工具提供商优质排行 - 品牌鉴赏师
  • BIGDECIMAL VS DOUBLE:精度与性能的终极对比
  • 珊瑚单词英语版PRD-1
  • 浪潮项目
  • 2026年常用A1标书平台,AI标书制作,AI标书提供商品牌推荐清单 - 品牌鉴赏师
  • lvgl文件系统移植基于windows
  • 用LLAMAINDEX快速验证你的数据检索创意
  • msvcr100.dll文件丢失这么解决的,下载丢失文件免费分享
  • 深度学习毕设项目:python基于深度学习训练识别常见水果
  • 完整教程:CCF-CSP 36-3 缓存模拟(cache)【C++】
  • java社区智慧医疗养老系统vue3