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

一、匹配的整体思路

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

二、代码实现

  • 步骤如下:

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

  • 模板匹配的方法可以通过以下链接内容进行理解:

  • 代码如下:

    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)
    
  • 结果如下:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值