代码实现:

import cv2
import numpy as npimg_rgb = cv2.imread('mobanpipei.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('jianto.jpg', flags=0)
h, w = template.shape[:2]# 读取图像# # 顺时针旋转 90 度(k=1)
# rotated_image1 = np.rot90(template, k=1)
# # 逆时针旋转 90 度(k=-1)
# rotated_image2 = np.rot90(template, k=-1)
j=[0,1,-1]
# 模板匹配
for i in j:template1 = np.rot90(template,k=i)res = cv2.matchTemplate(img_gray, template1, cv2.TM_CCOEFF_NORMED)threshold = 0.9  # 匹配阈值loc = np.where(res >= threshold)  # 获取符合阈值的坐标(行,列)# 绘制所有匹配区域的矩形框for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=6)cv2.imshow('Template Matching Result', img_rgb)
cv2.waitKey(0)

这段代码是一个带旋转角度的模板匹配程序,核心功能是在目标图像中查找与模板图像(包含 0°、90° 顺时针、90° 逆时针三种旋转状态)匹配度较高的区域,并标记出这些区域。下面分步骤解析:

一、基础准备:导入库与读取图像

import cv2  # 导入OpenCV库,用于图像处理
import numpy as np  # 导入numpy库,用于数组操作(如旋转)# 读取目标图像(待检测的大图),默认读取为BGR格式
img_rgb = cv2.imread('mobanpipei.jpg')
# 将目标图像转为灰度图(模板匹配通常在单通道灰度图上进行,减少计算量)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)# 读取模板图像(要查找的小图),flags=0表示以灰度图格式读取
template = cv2.imread('jianto.jpg', flags=0)
# 获取模板图像的高和宽(h:高度,w:宽度),后续绘制匹配区域时需要
h, w = template.shape[:2]

核心目的:加载目标图像和模板图像,并将目标图像转为灰度图(模板匹配对颜色不敏感,灰度图可简化计算)。

注意:模板图像直接以灰度图读取(flags=0),避免后续重复转换。

二、处理模板旋转:考虑多方向匹配

# 定义旋转角度参数:0(不旋转)、1(顺时针90°)、-1(逆时针90°)
j = [0, 1, -1]

为什么需要旋转?实际场景中,模板可能在目标图像中以不同角度存在(比如模板是 “箭头”,可能朝上、朝左、朝右),通过旋转模板可提高匹配覆盖率。

np.rot90函数说明:k=0表示不旋转;k=1表示顺时针旋转 90°;k=-1表示逆时针旋转 90°。

三、核心逻辑:多角度模板匹配与结果标记

# 遍历每个旋转角度,分别进行模板匹配
for i in j:# 按当前角度旋转模板(得到旋转后的模板)template1 = np.rot90(template, k=i)# 模板匹配:在目标灰度图中查找与旋转后模板匹配的区域# 方法:cv2.TM_CCOEFF_NORMED(归一化相关系数匹配,结果范围[-1,1],越接近1匹配度越高)res = cv2.matchTemplate(img_gray, template1, cv2.TM_CCOEFF_NORMED)# 设置匹配阈值(只保留匹配度≥0.9的区域,阈值越高,匹配越严格)threshold = 0.9# 找到所有匹配值≥阈值的位置坐标(返回的loc是元组,格式:(行坐标列表, 列坐标列表))loc = np.where(res >= threshold)# 遍历所有符合条件的坐标,绘制矩形框标记匹配区域# zip(*loc[::-1]):将坐标从(行,列)转换为(列,行)(OpenCV中图像坐标是(x,y)对应列和行)for pt in zip(*loc[::-1]):# 绘制矩形:左上角坐标pt=(x,y),右下角坐标=(x+w, y+h),红色(BGR中(0,0,255)),线宽6cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=6)

模板匹配原理:cv2.matchTemplate会在目标图像上滑动模板,计算每个位置的匹配度,生成一个 “匹配结果图”(res),其中每个像素值代表该位置的匹配程度。

坐标转换细节:loc返回的是(行,列),而 OpenCV 绘制矩形需要(x,y)(对应列、行),因此用loc[::-1]反转顺序,再用zip(*)转换为可迭代的坐标对。

阈值选择:threshold=0.9是经验值,可根据实际匹配效果调整(值太高可能漏检,太低可能误检)。

四、显示结果

# 显示标记了匹配区域的目标图像
cv2.imshow('Template Matching Result', img_rgb)
# 等待按键输入(0表示无限等待),按任意键后关闭窗口
cv2.waitKey(0)

最终在窗口中显示目标图像,所有匹配度≥0.9 的区域会被红色矩形框标记。

实现效果:

代码特点与注意事项

  1. 多角度匹配:通过旋转模板(0°、90° 顺 / 逆时针),解决了模板在目标图像中旋转导致的匹配失效问题。
  2. 潜在优化点
    • 旋转后模板的尺寸会变化(如 90° 旋转后,原高度 h 变为宽度,原宽度 w 变为高度),但代码中仍用原wh绘制矩形,可能导致矩形框尺寸不准确(需根据旋转后的模板尺寸动态调整)。
    • 未处理模板缩放问题:如果目标图像中模板的大小与原图不同,可能匹配失败(可结合图像金字塔实现多尺度匹配)。
  3. 适用场景:适用于检测目标在图像中可能存在 90° 旋转的场景(如特定图标、符号等)。

总结:这段代码通过 “旋转模板 + 多角度匹配” 的思路,提高了模板匹配的鲁棒性,能有效标记出目标图像中与不同角度模板匹配的区域,是模板匹配技术在实际场景中的典型应用。

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

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

相关文章

OS28.【Linux】自制简单的Shell的修bug记录

目录 1.问题代码 2.排查 前期检查 查找是谁修改了environ[0] 使用gdb下断点 查看后续的影响 分析出问题的split_commandline函数 3.反思 4.正确代码 5.结论 6.除此之外...... ★提示: 此bug非常隐蔽,不仔细分析很难查出问题,非常锻炼调试能力! 1.问题代码 #includ…

Debian 系统上安装与配置 MediaMTX

🎯 在 Debian 系统上安装与配置 MediaMTX(原 rtsp-simple-server):打造轻量级流媒体服务器 作者:远在太平洋 环境:Debian 10/11/12 | Ubuntu 可参考 关键词:MediaMTX、rtsp-simple-server、RTSP…

分布式专题——10.4 ShardingSphere-Proxy服务端分库分表

1 为什么要有服务端分库分表? ShardingSphere-Proxy 是 ShardingSphere 提供的服务端分库分表工具,定位是“透明化的数据库代理”。 它模拟 MySQL 或 PostgreSQL 的数据库服务,应用程序(Application)只需像访问单个数据…

Mysql相关的面试题1

什么是聚集索引(聚簇索引)?什么是二级索引(非聚簇索引)? 聚集索引就是叶子节点关联行数据的索引,二级索引就是叶子节点关联主键的索引,聚集索引必须有且仅有一个,二级索引…

电涌保护器:为现代生活筑起一道隐形防雷网

何为电涌保护器?电涌保护器(Surge Protective Device,简称SPD)主要用于控制信号系统,保护电气电子设备信号线路免受雷电电磁脉冲、感应过电压、操作过电压的影响,广泛应用于工控、消防、安防监控、交通、电…

【uniapp微信小程序】扫普通链接二维码打开小程序

需求:用户A保存自己的邀请码海报,用户B扫描该普通连接二维码,打开微信小程序,并且携带用户A的邀请码信息,用户B登录时,跟用户A关联,成为用户A的下级。 tips:保存海报到手机相册可以参…

LeetCode 378 - 有序矩阵中第 K 小的元素

文章目录摘要描述题解答案题解代码分析代码解析示例测试及结果输出结果时间复杂度空间复杂度总结摘要 在开发中,我们经常遇到需要处理大规模有序数据的场景,比如数据库分页、排行榜查询、或者处理排序过的矩阵。LeetCode 第 378 题“有序矩阵中第 K 小的…

【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程

▒ 目录 ▒🛫 导读需求环境1️⃣ 核心原理:Windows下Lua与C的交互逻辑2️⃣ Windows下编写步骤:以mymath模块为例2.1 步骤1:准备Windows开发环境方式1:官网下载Lua源码并编译(可控性高)方式2&am…

Python快速入门专业版(二十九):函数返回值:多返回值、None与函数嵌套调用

目录引一、多返回值:一次返回多个结果的优雅方式1. 多返回值的本质:隐式封装为元组示例1:返回多个值的函数及接收方式2. 多返回值的接收技巧技巧1:用下划线_忽略不需要的返回值技巧2:用*接收剩余值(Python …

python使用pip安装的包与卸载

1:基本卸载命令 # 卸载单个包 pip uninstall package_name# 示例:卸载requests包 pip uninstall requests2:卸载多个包 # 一次性卸载多个包 pip uninstall package1 package2 package3# 示例 pip uninstall requests numpy pandas3&#xff1…

超级流水线和标量流水线的原理

一、什么是流水线?要理解这两个概念,首先要明白流水线(Pipelining) 的基本思想。想象一个汽车装配工厂:* 没有流水线:一个工人负责组装一整辆汽车,装完一辆再装下一辆。效率很低。* 有了流水线&…

【Ansible】管理复杂的Play和Playbook知识点

1.什么是主机模式?答:主机模式是Ansible中用于从Inventory中筛选目标主机的规则,通过灵活的模式定义可精准定位需要执行任务的主机。2.主机模式的作用答:筛选目标:从主机清单中选择一个或多个主机/组,作为P…

FastGPT源码解析 Agent 智能体应用创建流程和代码分析

FastGPT对话智能体创建流程和代码分析 平台作为agent平台,平台所有功能都是围绕Agent创建和使用为核心的。平台整合各种基础能力,如大模型、知识库、工作流、插件等模块,通过可视化,在界面上创建智能体,使用全部基础能…

缺失数据处理全指南:方法、案例与最佳实践

如何处理缺失数据:方法、案例与最佳实践 1. 引言 在数据分析和机器学习中,缺失数据是一个普遍存在的问题。如何处理缺失值,往往直接影响到后续分析和建模的效果。处理不当,不仅会浪费数据,还可能导致模型预测结果的不准…

为什么Cesium不使用vue或者react,而是 保留 Knockout

1. Knockout-ES5 插件的语法简化优势 自动深度监听:Cesium 通过集成 Knockout-ES5 插件,允许开发者直接使用普通变量语法(如 viewModel.property newValue)替代繁琐的 observable() 包装,无需手动声明每个可观察属性。…

Word怎么设置页码总页数不包含封面和目录页

有时候使用页码格式是[第x页/共x页]或[x/x]时会遇到word总页数和实际想要的页数不一致,导致显示不统一,这里介绍一个简单的办法,适用于比较简单的情况。 一、wps版本 文章分节 首先将目录页与正文页进行分节:在目录页后面选择插入…

突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

引言: 从协作机械臂到人形机器人,一文拆解主流总线技术选型困局 在机器人技术飞速发展的今天,从工厂流水线上的协作机械臂到科技展会上的人形机器人,它们的“神经系统”——通讯总线,正面临着前所未有的挑战。特斯拉O…

Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)

1. Java是什么? Java首先是一种编程语言。它拥有特定的语法、关键字和结构,开发者可以用它来编写指令,让计算机执行任务。核心特点: Java最著名的特点是“一次编写,到处运行”(Write Once, Run Anywhere - …

OSPF高级技术 相关知识点

1.多区域OSPFospf 设计多区域原因:① 每个区域的路由器只需同步自己所在区域的链路状态数据库,分区域设 计可以使得每个区域的链路状态数据库得以减少。以降低路由器cpu、内存 的消耗。② 避免某区域内的网络故障(例如:接口频繁up…

Linux / Windows 下连续发送多帧 8 字节指令,下位机只响应第一帧,第二帧“丢失”。

串口编程易错点笔记 基于 serial::Serial(wjwwood serial 库) 场景:Linux / Windows 下连续发送多帧 8 字节指令,下位机只响应第一帧,第二帧“丢失”。1. 现象 serial::Serial ser("/dev/ttyUSB0", 115200);…