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

《OpenCV计算机视觉》—— 通过旋转模板图像匹配多个目标区域

文章目录

  • 一、匹配的整体思路
  • 二、代码实现

一、匹配的整体思路

  • 下面是一张需要进行模板匹配的图片
    在这里插入图片描述
  • 模板图片如下
    在这里插入图片描述
  • 通过观察可以发现,需要进行匹配的图片中,有与模板图片不同方向的目标区域,有逆时针90度的目标区域,还有顺时针90度的目标区域
  • 因此只通过模板图片来进行模板匹配的话,并不能将所有的目标区域都匹配成功
  • 所以我们需要将模板图片进行不同方向的旋转,旋转至能够满足所有目标区域的匹配
  • 将每个方向的模板图片都在需要匹配的图片中进行模板匹配,直至匹配完所有的目标区域

二、代码实现

  • 步骤如下:

    • 1.读取需要进行模板匹配的图片和模板图片
    • 2.将模板图片进行不同方向上的旋转
    • 3.用所有方向的模板图片进行模板匹配
    • 4.在原图片中画出所有匹配成功后布标区域的矩形框
    • 5.显示最后的结果
  • 图片的旋转方法可以通过以下链接内容进行理解:

    • https://blog.csdn.net/weixin_73504499/article/details/142070536?spm=1001.2014.3001.5501
  • 模板匹配的方法可以通过以下链接内容进行理解:

    • https://blog.csdn.net/weixin_73504499/article/details/141905861?spm=1001.2014.3001.5501
  • 代码如下:

    import cv2
    import numpy as np# 读取需要进行模板匹配的原图
    img_rgb = cv2.imread('image.jpg')
    # 将原图转换为灰度图,为了减少后续操作的复杂程度(可选)
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGRA2RGB)
    # 读取模板图片
    template = cv2.imread('tem.jpg')
    # 获取模板图片的宽高
    h, w = template.shape[:2]# 将模板图片进行旋转
    rotated_image = cv2.rotate(template, cv2.ROTATE_90_CLOCKWISE)  # 顺时针旋转90度
    rotated_image1 = cv2.rotate(template, cv2.ROTATE_90_COUNTERCLOCKWISE)  # 逆时针旋转90度# 将模板图片和旋转后的模板图片都存放在一个列表中
    list_pic = [template, rotated_image, rotated_image1]# 循环 list_pic 列表中各个方向的模板,使用模板匹配方法 cv2.matchTemplate 进行模板匹配
    for i in list_pic:res = cv2.matchTemplate(img_gray, i, cv2.TM_CCOEFF_NORMED)# 设定匹配阈值threshold = 0.9# 获取匹配结果中所有的符合阈值的点的坐标loc = np.where(res >= threshold)# 遍历所有匹配点#  loc 是一个元组类型,loc[::-1] 将 [(y y...y),(x x...x)] --> [(x x...x),(y y...y)]# zip(*) 函数将 [(x x...x),(y y...y)] --> [(x,y), (x,y)...(x,y)]# 利用 * 操作符,可以将可迭代对象解压为独立参数for pt in zip(*loc[::-1]):# 在原图上绘制匹配区域的矩形框cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)# 显示最后的结果
    cv2.imshow('res_png', img_rgb)
    cv2.waitKey(0)
    
  • 结果如下:
    在这里插入图片描述


http://www.mrgr.cn/news/24215.html

相关文章:

  • Windows 急救系列
  • shader 案例学习笔记之smoothstep函数
  • 9代现场实拍图
  • Fiddler
  • Elasticsearch7.x 集群迁移文档
  • 浅谈proc目录
  • 带你0到1之QT编程:九、布局Layouts两大手段搞定常用开发
  • 线路及接口基础知识
  • 滚雪球学MyBatis(09):MyBatis与Spring整合
  • sqlserver常用的sql命令
  • 聚观早报 | 2025款比亚迪汉上市;iPhone 16天猫全球同步首发
  • ADCS攻击详解—ESC1
  • 博物馆如何实现3D交互控制展示?
  • JavaSSM框架项目 在线投票系统(ppt+详细文档)
  • memcpy 函数
  • Redis 的数据持久化
  • 水平居中的几种方法(总结)
  • 探索Python中的变量声明、初始化、删除变量与垃圾回收机制
  • python测试开发---vue的常见指令
  • 【C++】面试基础重点知识