(纯新手教学)计算机视觉(opencv)实战十四——模板与多个对象匹配

图片旋转、图片镜像相关教学:
(纯新手教学)计算机视觉(opencv)实战十三——图片旋转、图片镜像 的几种常用方法-CSDN博客https://blog.csdn.net/2302_78022640/article/details/151356600?spm=1011.2415.3001.5331


模板与多个对象匹配

在计算机视觉中,模板匹配(Template Matching)是一种常见的图像处理方法,能够在大图像中寻找与小模板相似的区域。很多时候,模板在目标图像中可能不止出现一次,并且还可能存在旋转的情况。因此,模板与多个对象的匹配技术就显得非常重要。

下面的代码演示了如何使用 OpenCV 进行模板匹配,并支持在目标图像中同时查找多个方向的模板对象。


 核心函数:cv2.matchTemplate

OpenCV 提供了 cv2.matchTemplate 函数来实现模板匹配。

cv2.matchTemplate(image, templ, method, result=None, mask=None)

参数说明:

  • image:待搜索的图像(通常比模板大)。

  • templ:模板图像,需要在大图中被搜索的目标。

  • method:匹配方法,用来衡量相似度。

  • result:存放匹配结果的矩阵,一般不用手动传入,函数会自动生成。

  • mask:掩膜,可选参数,某些方法不支持。


常见匹配方法

模板匹配的效果依赖于所选择的计算方式。OpenCV 提供了六种主要方法:

  1. TM_SQDIFF(平方差匹配法)

    • 使用平方差衡量误差。

    • 匹配越好,结果值越小。

  2. TM_CCORR(相关匹配法)

    • 采用乘法运算,计算图像与模板的相关性。

    • 数值越大表示匹配程度越高。

  3. TM_CCOEFF(相关系数匹配法)

    • 通过相关系数计算相似度,排除了亮度影响。

    • 数值越大说明匹配效果越好。

  4. TM_SQDIFF_NORMED(归一化平方差匹配法)

    • 与 TM_SQDIFF 类似,但结果被归一化。

    • 匹配越好,值越小。

  5. TM_CCORR_NORMED(归一化相关匹配法)

    • 在 TM_CCORR 的基础上进行归一化,结果范围更稳定。

    • 数值越大,匹配越好。

  6. TM_CCOEFF_NORMED(归一化相关系数匹配法)

    • 在 TM_CCOEFF 的基础上进行归一化,最常用的一种方法。

    • 结果范围通常在 -1 到 1 之间,越接近 1 匹配越好。


图片准备:

arrow.jpg

arrows.jpg

运行结果图:

代码解析

import cv2
import numpy as npimg_rgb = cv2.imread('arrows.jpg')
cv2.imshow('img_gray', img_rgb)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template1=cv2.imread('./arrow.jpg', flags=0)
# 旋转 90 度,k=-1 表示顺时针旋转 90 度
template2 = np.rot90(template1, k=-1)
# 旋转 90 度,k=1 表示逆时针旋转 90 度
template3 = np.rot90(template1, k=1)
template4 = np.rot90(template1, k=2)
cv2.imshow('template1', template1)
cv2.imshow('template2', template2)
cv2.imshow('template3', template3)
cv2.imshow('template4', template4)
cv2.waitKey(0)templates=[template1,template2,template3,template4]for template in templates:h, w = template.shape[:2]# 使用模板匹配方法 cv2.matchTemplate 进行模板匹配res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)threshold = 0.9  # 设定匹配阈值# 获取匹配结果中所有符合阈值的点的坐标loc = np.where(res >= threshold)  # 符合条件的行,符合条件的列# print(loc)# 遍历所有匹配点for pt in zip(*loc[::-1]):# 在原图上绘制匹配区域的矩形框cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=1)cv2.imshow('result', img_rgb)
cv2.waitKey(0)

核心步骤讲解

  1. 读取图像并灰度化

    • 使用 cv2.imread 读取原始图像 arrows.jpg,并转换为灰度图。

    • 灰度图可以减少计算量,同时保留了模板匹配所需的主要信息。

  2. 加载模板并进行旋转

    • 模板 arrow.jpg 作为基本形状。

    • 使用 np.rot90 对模板进行旋转,生成 4 个方向的模板(0°、90°、180°、270°)。

    • 这样就能应对目标图像中箭头方向不一致的情况。

  3. 模板匹配

    • cv2.matchTemplate 用于计算模板与目标图像各个位置的匹配程度。

    • 选择 cv2.TM_CCOEFF_NORMED 方法,该方法会输出归一化相关系数,值越接近 1 表示越相似。

  4. 匹配阈值设定

    • 设置 threshold = 0.9,即相似度大于等于 0.9 的区域才认为是有效匹配。

    • 阈值过低可能引入误检,过高可能漏检。

  5. 定位与绘制

    • np.where(res >= threshold) 找到所有符合条件的点。

    • 使用 cv2.rectangle 在原图 img_rgb 上绘制矩形框,标记出匹配区域。

  6. 结果展示

    • 使用 cv2.imshow 显示最终带有标记的图像。


应用场景

  1. 目标检测
    在工厂生产线上检测零件是否存在、方向是否正确。

  2. 游戏自动化
    在屏幕截图中查找某个按钮或图标的位置,实现自动点击。

  3. 文档处理
    在扫描件中查找特定的标志或符号。

  4. 视频监控
    在实时视频中检测特定物体的出现与方向。


方法优缺点

  • 优点

    • 实现简单,代码量少。

    • 适合已知模板的精确匹配任务。

    • 可以通过旋转模板来解决方向差异。

  • 缺点

    • 对尺度变化不敏感(如果模板大小与目标图像中对象大小不同,效果不好)。

    • 对光照、噪声等变化敏感。

    • 计算效率在大规模匹配时较低。


总结

通过这段代码,可以看到如何使用 OpenCV 的模板匹配方法,结合旋转操作,在图像中查找多个方向的相同目标对象。该方法在简单场景下效果显著,尤其适合对象外形固定、尺寸不变的任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96660.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试核心知识点总结:Redis与MySQL高可用、高并发解决方案

在分布式系统开发中,高并发场景下的数据一致性、系统可用性以及性能优化始终是核心挑战。本文基于Java技术栈,结合Redis与MySQL的工程实践,系统梳理分布式系统设计的关键技术要点。一、Redis集群架构演进与高可用实践1.1 主从哨兵模式部署方案…

R 语言科研绘图第 72 期 --- mantel检验图

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…

4.2-中间件之MySQL

4.2.1MySQL的基本知识SQL语句用于存取数据以及查询、更新和管理关系数据库系统。包括:DQL(select)、DML(insert,update,delete)、DDL(create,alter,drop)、DCL(grant,revoke&#xf…

LVS + Keepalived 高可用负载均衡集群

目录 一、核心组件与作用 1. LVS(Linux Virtual Server) 2. Keepalived 二、DR 模式下的 LVS Keepalived 工作原理 1. 整体架构 2. 数据包流向(DR 模式) 三、部署步骤(DR 模式) 3.1 环境规划 3.2…

知识沉淀过于碎片化如何形成体系化框架

要将过于碎片化的知识沉淀转变为体系化的框架,必须采取一套自上而下设计与自下而上归集相结合的系统性方法,其核心路径在于首先进行战略性诊断与顶层蓝图设计、其次构建统一且可扩展的知识架构(分类与标签体系)、然后实施系统性的…

XLua教程之C#调用Lua

上一篇文章 XLua教程之入门篇-CSDN博客 在C#脚本中访问lua全局数据,特别是table以及function,代价比较大,建议尽量少做相关操作。 LuaEnv.Global.Get 用于获取一个全局变量,但是无法获取局部变量(用local修饰) 全局基本类型变量…

C++ 标准库中的哈希函数:从std::hash到自定义哈希器

C 标准库中的哈希函数:从 std::hash 到自定义哈希器 1. 引言 在上一篇中,我们介绍了哈希表为什么能够实现 O(1) 查找。 核心秘密在于:哈希函数。 在 C 标准库中,哈希表容器(如 unordered_map、unordered_set&#xff0…

在图形 / 游戏开发中,为何 Pixels Per Unit(PPU)数值越小,物体在屏幕上显示的尺寸越大?

1. 什么是 PPU? PPU(Pixels Per Unit)指的是 多少像素对应游戏世界中的一个单位(Unit)。 在 Unity 等游戏引擎中,1 Unit 通常被视为世界空间的基本长度,比如 1 米。2. PPU 与物体大小的关系PPU …

【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置

使用Petalinux工具为ZYNQ板卡搭建嵌入式Linux操作系统,成功搭建后,用户通常会使用客户端软件对ZYNQ板卡上的Linux系统进行访问,软件需要知道ZYNQ板卡的ip地址才能进行访问,如果ip地址是动态变化的,软件每次访问都要重新…

AVL树知识总结

AVL树概念性质一颗AVL树或是空树,或者具有一下性质的二叉搜索树:左右都是AVL树,左右子树高度差的绝对值不超过1AVL树有n个结果,高度保持在O(logN) 搜索时间复杂度O(logN)模拟实现插入定义&#…

返利app的跨域问题解决方案:CORS与反向代理在前后端分离架构中的应用

返利app的跨域问题解决方案:CORS与反向代理在前后端分离架构中的应用 大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿! 在返利APP的前后端分离架构中,跨…

【dl】python基础 深度学习中需要用到的python基础

直接在jupyter写笔记然后导出md格式真的太好用了本文笔记来自小破站视频BV1K14y1c75ePython 基础 1. 变量 1.1 三种基本变量类型 # 字符串 str str_v "123"# 数字 int或float num_v 11 float_v 12.0# 布尔型 bool bool_v True1.1.1 字符串 f字符串:在…

Vue FullPage.js 完整使用指南:Vue 3 官方全屏滚动解决方案

概述 vue-fullpage.js 是 FullPage.js 的官方 Vue.js 3 包装器,为 Vue 3 应用提供了强大的全屏滚动功能。该插件基于成熟的 FullPage.js 库,支持多种滚动效果和丰富的配置选项,特别适用于企业级数据大屏、产品展示、单页应用等场景。 官方信…

软件工程实践一:Git 使用教程(含分支与 Gitee)

文章目录目标一、快速上手1. Windows 安装 Git2. 初始化 / 克隆二、核心概念速览三、常用命令清单1) 查看状态与差异2) 添加与提交3) 历史与回溯4) 撤销与恢复(Git 2.23 推荐新命令)5) 忽略文件四、分支与合并(Branch & Merge&#xff09…

css`min()` 、`max()`、 `clamp()`

min() 用来计算多个数值中最小的那个,非常适合做自适应。 width: min(50vw, 500px) 50vw 表示 视口宽度的 50% 500px 表示 500px min(50vw, 500px) 表示会取两者中 最小的那个 作为最终的宽度,。 使用场景 限制某个元素宽度不超过某个值; 响…

【WRF-VPRM 预处理器】HEG 安装(服务器)-MRT工具替代

目录 HEG 安装 验证 HEG 安装与否 设置环境变量(建议) 命令行接口(Command Line Interface) hegtool 工具 hegtool 用法 Header File 格式 功能1:`gdtif` 工具 – MISR 数据处理 `gdtif` 使用方式 参数文件格式(Parameter File Format) 功能2:`resample` 工具 – 重采样…

PyTorch 神经网络

神经网络是一种模仿人脑神经元链接的计算模型, 由多层节点组成, 用于学习数据之间的复杂模式和关系。神经网络通过调整神经元之间的连接权重来优化预测结果,这个过程可以涉及到向前传播,损失计算,反向传播和参数更新。…

详细解析苹果iOS应用上架到App Store的完整步骤与指南

📱苹果商店上架全流程详解 👩‍💻想要将你的App上架到苹果商店?跟随这份指南,一步步操作吧! 1️⃣ 申请开发者账号:访问苹果开发者网站,注册并支付99美元年费,获取开发者…

三维GIS开发实战!Cesium + CZML 实现火箭飞行与分离的 3D 动态模拟

CZML是一种基于JSON的数据格式,专门用于在Cesium中描述3D场景和时间动态数据。本文将详细介绍了CZML的特点(JSON格式、时间动态性、层次结构等)和基本组件,并给出了一个火箭发射的实例。通过搭建Cesium开发环境(使用vi…

Spring Boot 深入剖析:BootstrapRegistry 与 BeanDefinitionRegistry 的对比

在 Spring Boot 的启动过程中,BootstrapRegistry 和 BeanDefinitionRegistry 是两个名为“Registry”却扮演着截然不同角色的核心接口。理解它们的差异是深入掌握 Spring Boot 启动机制和进行高级定制开发的关键。BootstrapRegistry public static ConfigurableAppl…