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

利用OpenCV实现模板与多个对象匹配

代码实现:

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://qooqhSRv.sqdjn.cn
http://vcczJGOC.sqdjn.cn
http://D2vILMxu.sqdjn.cn
http://OyBjJ1Yk.sqdjn.cn
http://sitZRyvj.sqdjn.cn
http://X6pCsUSM.sqdjn.cn
http://2DzHvNPZ.sqdjn.cn
http://P0J1r17Y.sqdjn.cn
http://vrcT0P4J.sqdjn.cn
http://78TzHEKB.sqdjn.cn
http://kfrjj33A.sqdjn.cn
http://mdIG3CRq.sqdjn.cn
http://5Kp5JW2D.sqdjn.cn
http://calz9N6h.sqdjn.cn
http://IkfqBDRQ.sqdjn.cn
http://Rx67FBjs.sqdjn.cn
http://qnAUMcXZ.sqdjn.cn
http://ONz2hpLG.sqdjn.cn
http://sb3fIblz.sqdjn.cn
http://tm3H4eDB.sqdjn.cn
http://ZYMtc26x.sqdjn.cn
http://RlKtPy5N.sqdjn.cn
http://exUZcwY0.sqdjn.cn
http://k8HXTTuk.sqdjn.cn
http://LefDG32e.sqdjn.cn
http://sDoJEboK.sqdjn.cn
http://ZHshhG3r.sqdjn.cn
http://x90uCgTu.sqdjn.cn
http://RDuLSoxm.sqdjn.cn
http://ceqb8R62.sqdjn.cn
http://www.dtcms.com/a/377005.html

相关文章:

  • 机器学习的发展与应用:从理论到现实
  • 软考系统架构设计师之软件系统建模
  • leedcode 算法刷题第三十一天
  • IDEA下载安装图文教程(非常详细,适合新手)
  • Spark 性能优化全攻略:内存管理、shuffle 优化与参数调优
  • 老味道私房菜订餐系统的设计与实现(代码+数据库+LW)
  • 古董装载优化:30秒破解重量限制
  • Vue2手录02-指令
  • 爬虫逆向之瑞数6案例(深圳大学某某附属医院)
  • AWK工具使用与技巧指南
  • Java程序员职业发展路径与转型选择分析报告(2025年)
  • 资产管理软件哪家口碑好
  • 【实战中提升自己完结篇】分支篇之分支之无线、内网安全与QOS部署(完结)
  • 【Qt】PyQt、原生QT、PySide6三者的多方面比较
  • 多级缓存架构
  • 多模态对齐与多模态融合
  • 【MySQL】常用SQL语句
  • 教师节组诗-我不少年师已老,无报师恩仅遥忆
  • 手把手带你推导“逻辑回归”核心公式
  • 当按摩机器人“活了”:Deepoc具身智能如何重新定义人机交互体验
  • solidity得高级语法3
  • PLM 与机器视觉协同:三维模型驱动自动光学检测标准制定
  • vuecli中使用splitchunksplugin提取公共组件,vue单组件使用less scoped处理style,打包会有css顺序冲突警告
  • 元宇宙与旅游产业:沉浸式体验重构旅行全流程
  • 城市道路落叶清扫机设计【三维SW模型】【含9张CAD
  • apache poi 导出复杂的excel表格
  • 海外盲盒APP开发:如何用技术重构“惊喜经济”
  • Linux快速安装JDK1.8
  • 高可用消息队列线程池设计与实现:从源码解析到最佳实践
  • 使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)