Bootstrap

《OpenCV》——模版匹配

OpenCV——模版匹配简介

  • OpenCV 是一个非常强大的计算机视觉库,其中的模板匹配功能提供了高效的工具来实现图像中的目标定位。
  • 从本质上来说,模板匹配是一种用于在给定的图像(或其他类型的数据,如文本序列等,但主要以图像为例)中寻找与已知模板最相似部分的方法。这个模板可以是一个小的图像区域,例如,你想在一张风景照片中找到某个特定的标志,这个标志的图像就是模板。
  • 它的基本原理是通过在目标图像的各个位置滑动模板,并计算模板与图像在每个位置的相似度度量。这个相似度度量可以通过多种方式计算,例如计算像素值的差异等。

模版匹配使用场景

  • 目标检测:假设在一个监控视频中,需要检测是否出现了特定的物体,如汽车的车牌。可以将车牌的标准图像作为模板,在视频的每一帧图像中进行模板匹配,找到与车牌模板最相似的区域,从而实现车牌的定位检测。
  • 物体识别:如果要识别图像中的某个产品品牌标志,把不同品牌标志的图像做成模板,在目标图像中进行匹配,通过比较匹配程度来判断物体属于哪个品牌。

OpenCV 中模板匹配的函数

在 OpenCV 中,主要使用matchTemplate函数来进行模板匹配。这个函数的基本语法如下:

result = cv2.matchTemplate(image, templ, method)

参数

  • image:这是目标图像,也就是要在其中寻找模板的图像。它应该是一个 8 位或 32 位的单通道或彩色图像。
  • templ:这是模板图像,是要在目标图像中找到的小图像区域。同样可以是单通道或彩色图像,但要注意其尺寸通常比目标图像小。
  • method:这是匹配方法,OpenCV 提供了多种匹配方法,如cv.TM_SQDIFF(平方差匹配法)、cv.TM_CCORR(相关性匹配法)、cv.TM_CCOEFF(相关系数匹配法)等。不同的方法在计算模板和目标图像之间的相似度时有不同的侧重点。
  • 例如,cv.TM_SQDIFF方法计算模板与目标图像每个位置的平方差,得到的结果矩阵中,值越小表示匹配程度越高;而cv.TM_CCORR方法计算相关性,值越大表示匹配程度越高。

OpenCV——模版匹配实例

对下方图片进行模版匹配:
在这里插入图片描述
模版:
在这里插入图片描述
目标:找到图中所有的箭头

导入所需库

  • 首先需要导入 OpenCV 库和 NumPy 库。
import cv2
import numpy as np

读取图片并处理图片

img_rgb = cv2.imread('yuan_tu.jpg')
# 对图片进行灰度图处理
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread('jian_tou.jpg', 0)
# 读取模版图片的高和宽
h,w = template.shape[:2]

对模版图片进行处理

通过对模版图片的顺时针和逆时针处理,后面能将所有箭头都找出。

# 分别顺时针逆时针旋转
xuan_zhuan1 =cv2.rotate(template,cv2.ROTATE_90_CLOCKWISE)

xuan_zhuan2 =cv2.rotate(template,cv2.ROTATE_90_COUNTERCLOCKWISE)

进行模版匹配

通过遍历箭头图片和处理后的两张箭头图片,将得到的结果绘制到原图上。

# 进行模版匹配
for i in [template,xuan_zhuan1,xuan_zhuan2]:
    res = cv2.matchTemplate(img_gray,i,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),(0,0,255),1)

显示模版匹配的结果

显示图片结果,结束后释放内存。

cv2.imshow('res.png',img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

注意事项

  • 图像预处理:在进行模板匹配之前,可能需要对目标图像和模板图像进行预处理。例如,将图像转换为灰度图(如果使用基于灰度的匹配方法),或者进行归一化操作以减少光照等因素的影响。可以使用cv.cvtColor函数将彩色图像转换为灰度图,如gray_target = cv.cvtColor(target_image, cv.COLOR_BGR2GRAY)。
  • 多目标匹配:如果目标图像中可能存在多个与模板匹配的目标,上述示例只是找到了最佳匹配位置。要找到所有匹配位置,可以设置一个阈值,当匹配程度(根据匹配方法得到的结果矩阵中的值)超过这个阈值时,就认为是一个匹配目标。然后通过遍历结果矩阵来找到所有满足阈值条件的位置,并标记出来。
  • 性能优化:当处理大尺寸图像或复杂模板时,模板匹配可能会比较耗时。可以考虑使用图像金字塔等技术来加速匹配过程,先在低分辨率的图像上进行粗匹配,然后在高分辨率图像上进行精匹配。
;