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

《Opencv》多对象模板匹配

目录

一、简介

二、模板匹配的基本原理

三、代码实现

四、结果展示

五、代码解析

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.kler.cn/a/508778.html

相关文章:

  • XML在线格式化 - 加菲工具
  • 大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(6)
  • 如何在vue中渲染markdown内容?
  • 怎么在iPhone手机上使用便签进行记录?
  • vue用户点进详情页再返回列表页,停留在原位置
  • QT 如何禁止QComboBox鼠标滚轮
  • Golang—— new() 、 make() 和简短声明符
  • 【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题
  • Linux查看日志命令
  • StyleGaussian: Instant 3D Style Transferwith Gaussian Splatting 论文解读
  • 如何将本地电脑上的文件夹设置为和服务器的共享文件夹
  • 基于Flutter的物联网后台系统
  • C++ ——— string类oj题:字符串中的第一个唯一字符
  • 从零开始,掌握Django Web开发
  • 软件测试 —— Selenium常用函数
  • 软件测试—接口测试面试题及jmeter面试题
  • 【UE5.3】UnrealLink 安装:fix Detected compiler newer than Visual Studio 2022
  • 如何使用策略模式并让spring管理
  • MySQL无限极分类表设计:实战项目中的高效解决方案
  • npm介绍
  • 汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮
  • JSON数据格式转换
  • 使用C语言实现栈的插入、删除和排序操作
  • thinkphp8.0 likeadmin 框架添加API 文档自动生成工具 apidoc支持
  • QT信号槽 笔记
  • Apache Web服务器技术指南 - 基于Kylin麒麟操作系统