《Opencv》多对象模板匹配

news/2025/1/19 0:26:32/

目录

一、简介

二、模板匹配的基本原理

三、代码实现

四、结果展示

五、代码解析

1. 图像读取与预处理

2. 模板旋转

3. 模板匹配

4. 绘制矩形框

5. 结果显示

六、核心知识点

1. 模板匹配的局限性

2. 多角度模板匹配

3. 颜色与可视化

七、应用场景

八、总结


一、简介

模板匹配是计算机视觉中的一种常用技术,用于在一幅图像中查找与给定模板图像最相似的部分。它在目标检测、图像识别等领域有着广泛的应用。本文将介绍模板匹配的基本原理,并通过一个实际的代码示例,展示如何使用OpenCV实现模板匹配。


二、模板匹配的基本原理

模板匹配的核心思想是通过滑动模板图像(Template)在目标图像(Source Image)上移动,逐像素计算相似度,找到与模板最匹配的区域。OpenCV提供了多种相似度计算方法,常用的有以下几种:

  1. 平方差匹配(TM_SQDIFF):计算模板与目标图像的平方差,值越小表示匹配度越高。

  2. 归一化平方差匹配(TM_SQDIFF_NORMED):对平方差进行归一化处理,值范围在0到1之间。

  3. 相关系数匹配(TM_CCOEFF):计算模板与目标图像的相关系数,值越大表示匹配度越高。

  4. 归一化相关系数匹配(TM_CCOEFF_NORMED):对相关系数进行归一化处理,值范围在-1到1之间。

  5. 相关匹配(TM_CCORR):计算模板与目标图像的相关性,值越大表示匹配度越高。

  6. 归一化相关匹配(TM_CCORR_NORMED):对相关性进行归一化处理,值范围在0到1之间。

在本文的代码示例中,我们使用了 归一化相关系数匹配(TM_CCOEFF_NORMED),因为它对光照变化和噪声具有一定的鲁棒性。


三、代码实现

材料

 

以下是使用OpenCV实现模板匹配的完整代码:

import cv2
import numpy as np# 读取原始图像
img_rgb = cv2.imread('./images/image.jpg')# 将原始图像转换为灰度图
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)# 读取特征图
temp0 = cv2.imread('./images/tem.jpg', 0)# 顺时针90度旋转
temp1 = np.rot90(temp0, -1)# 逆时针90度旋转
temp2 = np.rot90(temp0, 1)# 将不同旋转角度的模板图像存储在列表中
temps = [temp0, temp1, temp2]# 获取模板图像的高度和宽度
h, w = temp0.shape[:2]# 定义颜色列表:红、蓝、绿
colors = [(0, 0, 255), (255, 0, 0), (0, 255, 0)]# 遍历每个模板图像
for i, temp in enumerate(temps):# 使用模板匹配算法res = cv2.matchTemplate(img_gray, temp, cv2.TM_CCOEFF_NORMED)# 找到匹配度大于等于0.9的位置loc = np.where(res >= 0.9)# 获取当前颜色b, g, r = colors[i % len(colors)]# 在匹配位置绘制矩形框for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (b, g, r), 1)# 显示结果图像cv2.imshow('res', img_rgb)cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()

四、结果展示


 

五、代码解析

1. 图像读取与预处理

  • 使用 cv2.imread 读取原始图像和模板图像。

  • 将原始图像转换为灰度图,以便进行模板匹配。

2. 模板旋转

  • 使用 np.rot90 对模板图像进行旋转,生成不同角度的模板(如顺时针90度、逆时针90度)。

  • 将不同角度的模板存储在列表 temps 中。

3. 模板匹配

  • 使用 cv2.matchTemplate 进行模板匹配,计算目标图像与模板的相似度。

  • 通过 np.where 找到匹配度大于等于0.9的位置。

4. 绘制矩形框

  • 使用 cv2.rectangle 在匹配位置绘制矩形框。

  • 为了区分不同模板的匹配结果,使用不同的颜色(红、蓝、绿)绘制矩形框。

5. 结果显示

  • 使用 cv2.imshow 显示匹配结果,并通过 cv2.waitKey 等待用户按下任意键继续。


六、核心知识点

1. 模板匹配的局限性

  • 尺度不变性:模板匹配对图像的尺度变化敏感,如果目标图像与模板图像的尺度不同,匹配效果会变差。

  • 旋转不变性:模板匹配对旋转敏感,本文通过旋转模板图像来解决这一问题。

  • 计算复杂度:模板匹配的计算量较大,尤其是在大图像中搜索小模板时。

2. 多角度模板匹配

  • 通过旋转模板图像,可以实现多角度模板匹配,提高匹配的鲁棒性。

3. 颜色与可视化

  • 使用不同颜色的矩形框标注匹配结果,可以直观地区分不同模板的匹配结果。


七、应用场景

模板匹配在许多实际场景中都有应用,例如:

  1. 目标检测:在图像中检测特定目标,如Logo、标志等。

  2. 图像拼接:通过匹配特征区域,将多幅图像拼接成一幅大图。

  3. 工业检测:在生产线中检测产品是否符合标准。


八、总结

本文介绍了模板匹配的基本原理,并通过一个实际的代码示例展示了如何使用OpenCV实现模板匹配。通过旋转模板图像和使用不同颜色的矩形框,我们可以实现多角度模板匹配,并直观地展示匹配结果。模板匹配虽然简单易用,但在实际应用中需要注意其局限性,并结合其他技术(如特征提取、深度学习)来提高匹配效果。


http://www.ppmy.cn/news/1564266.html

相关文章

JUC Java并发编程 高级 学习大纲 动员

目录 口诀 锁 阿里巴巴开发规范 字节面试题 面试题 1 面试题 2 鼓舞 口诀 高内聚低耦合前提下 封装思想 线程 -- 操作 -- 资源类 判断、干活、通知防止虚假唤醒 ,wait 方法要注意注意标志位 flag 可能是 volatile 的 锁 阿里巴巴开发规范 参考书 并发编程…

JavaWeb 前端基础 html + CSS 快速入门 | 018

今日推荐语 指望别人的救赎,势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽,我是菜鸟阿康。 今天 正式进入JavaWeb 的学习,简单学习 html CSS 这2各前端基础部分&am…

抖音矩阵是什么

抖音矩阵是指在同一品牌或个人IP下,通过创建多个不同定位的抖音账号(如主号、副号、子号等),形成一个有机的整体,以实现多维度、多层次的内容覆盖和用户互动。以下是关于抖音矩阵的详细介绍: 抖音矩阵的类…

PHP生产管理系统

生产管理系统:企业数字化转型的智慧引擎 🚀 💻 这是一款基于PHPLayuiuniapp框架,匠心独运的生产管理系统,专为推动企业向数字化、智能化转型而生。它是一套全面且高度定制化的解决方案,深度贴合各类生产企…

Docker与虚拟机的区别及常用指令详解

在现代软件开发中,容器化和虚拟化技术已经成为不可或缺的工具。Docker和虚拟机(VM)是两种常见的技术, 它们都可以帮助开发者在不同的环境中运行应用程序。然而,它们的工作原理和使用场景有很大的不同。本文将详细探讨D…

MyBatis执行一条sql语句的流程(源码解析)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程(源码解析) MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…

我的常用vim操作

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 我的常用vi操作 1. 文件打开与保存 打开文件操作:vi xxx.h 查看文件,不修改,:view xxx.h 写入并保存::wq 或 :x 有修改强制退出,不保存&#x…

如何使用Python将长图片分隔为若干张小图片

如何使用Python将长图片分隔为若干张小图片 1. Python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项6. 其他文章链接快来试试吧😊 1. Python需求的任务 _ 使用Python将长图片分隔为若干张小图片 我有如下的一张长图片 想要将其分割为若…