OpenCV-模板匹配多个目标

文章目录

  • 一、基本概念
  • 二、基本步骤
    • 1.图像准备
    • 2.图像预处理
    • 3.执行模板匹配
    • 4.定位匹配区域
    • 5.处理多个匹配
    • 6.优化和验证
  • 三、代码实现
    • 1.图片读取
    • 2.图像预处理
    • 3.模板匹配
    • 4.绘制矩形框
  • 三、总结

模型匹配(Model Matching)是一个广泛应用的概念,其具体含义和应用领域会根据上下文的不同而有所变化。

一、基本概念

模型匹配是指通过比较待匹配的数据或对象与已有的模型之间的相似度或距离,来寻找最佳匹配的过程。这种方法在多个领域都有广泛应用,包括但不限于图像处理、数据分析、控制系统设计、自然语言处理等。

二、基本步骤

1.图像准备

  • 模板图像:需要被匹配的目标图像,通常是一个较小的图像块。
  • 输入图像:在其中进行搜索以找到与模板图像相似的多个区域的图像。

2.图像预处理

  • 转换为灰度图像:在进行模板匹配之前,通常需要将输入图像和模板图像转换为灰度图像,因为灰度图像中的像素值仅表示亮度,不受颜色影响,更适合进行匹配。
  • 降噪和增强:根据需要,可以对图像进行降噪处理以提高匹配准确性,或进行增强处理以突出目标特征。

3.执行模板匹配

  • 使用模板匹配算法(如OpenCV中的cv2.matchTemplate()函数)在输入图像中搜索与模板图像相似的区域。
  • 模板匹配算法会生成一个结果图像,其中每个像素的值表示该位置与模板图像的匹配程度。

4.定位匹配区域

  • 使用cv2.minMaxLoc()等函数在结果图像中找到匹配度最高的区域(或多个区域,如果设置了适当的阈值)。
  • 根据匹配位置在原图中绘制矩形框或其他标记,以指示匹配到的目标。

5.处理多个匹配

  • 如果需要匹配多个目标,并且这些目标在图像中可能以不同的尺寸、方向或旋转角度出现,则可能需要使用更复杂的算法,如尺度不变特征变换(SIFT)、加速稳健特征(SURF)或ORB等。
  • 对于简单的多目标匹配,可以通过设置较低的匹配阈值来找到多个匹配区域,并分别处理它们。

6.优化和验证

  • 根据需要调整模板匹配算法的参数(如匹配方法、阈值等),以优化匹配结果。
  • 对匹配结果进行验证,确保它们确实是所需的目标,并排除误匹配。

三、代码实现

下面是一个图片的模板匹配,要进行输入的图片定为a.png,旁边就是要匹配的目标图片我们定为1.png。在这一张图片中存在多个目标,所有我们需要对目标图片1.png进行相关处理,例如旋转等操作。下面让我们来展示一下代码片段。
OpenCV-模板匹配多个目标_第1张图片

1.图片读取

import cv2
import numpy as np

img_rgb = cv2.imread('a.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('1.png', 0)
  • 读取输入图片与模板图片,并将输入图片进行灰度处理。

2.图像预处理

# 旋转模板
rotated_image1 = cv2.rotate(template, cv2.ROTATE_90_CLOCKWISE)  # 顺时针90°
rotated_image2 = cv2.rotate(template, cv2.ROTATE_90_COUNTERCLOCKWISE)  # 逆时针90°
h, w = template.shape[:2]
  • 这里我们对模板图片进行处理,通过cv2.ROTATE_90_CLOCKWISE与cv2.ROTATE_90_COUNTERCLOCKWISE操作对图片进行顺时针旋转90°和逆时针旋转90°操作。并取其对应的高宽。

3.模板匹配

# 使用模板匹配的方法,cv2.matchTemplate 进行模板匹配
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
res1 = cv2.matchTemplate(img_gray, rotated_image1, cv2.TM_CCOEFF_NORMED)
res2 = cv2.matchTemplate(img_gray, rotated_image2, cv2.TM_CCOEFF_NORMED)
  • 使用cv2.matchTemplate()在输入图像中搜索与模板图像相似的区域。

4.绘制矩形框

# 设定匹配阈值
threshold = 0.9
# 获取匹配结果中所有符合阈值的点的坐标
for i in (res, res1, res2):
    loc = np.where(i > threshold)
# 遍历所有的匹配点
    for pt in zip(*loc[::-1]):
        # 在原图上绘制匹配区域的矩形框
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)

cv2.imshow('a.png', img_rgb)
cv2.waitKey(0)

设定阈值,并获取结果中所有符合阈值的点的坐标,然后进行遍历,在原图上进行图像绘制,绘制矩阵框,并显示最终结果。
OpenCV-模板匹配多个目标_第2张图片

三、总结

本次主要讲述了模型匹配多个目标的方法过程,通过对模型匹配进行进一步讲解,然后对其方法进行介绍与举例,为大家展示了匹配多个目标的案例,通过对模板图像进行旋转等一系列操作,让其与输入图像中的各个区域相匹配,最终将匹配结果进行绘制矩阵框展示,为大家展示了具体效果。

你可能感兴趣的:(opencv,人工智能,计算机视觉)