模板匹配(opencv_python学习)


在OpenCV中,模板匹配是一种在图像中寻找指定模板的技术。它可以帮助我们在一幅图像中找到与给定模板最相似的区域。

一般模板匹配

cv.matchTemplate()函数用于在图像中执行模板匹配操作。它采用两个参数:原始图像和模板图像,并返回一个匹配结果的矩阵。它的语法如下:

result = cv.matchTemplate(image, template, method[, result[, mask]])

参数说明:

  • image:原始图像,可以是灰度图像或彩色图像。
  • template:模板图像,必须与原始图像具有相同的数据类型和通道数。
  • method:模板匹配方法,指定不同的比较方式。常用的方法有:
  • cv.TM_SQDIFF:平方差匹配方法。
  • cv.TM_SQDIFF_NORMED:归一化平方差匹配方法。
  • cv.TM_CCORR:相关性匹配方法。
  • cv.TM_CCORR_NORMED:归一化相关性匹配方法。
  • cv.TM_CCOEFF:相关系数匹配方法。
  • cv.TM_CCOEFF_NORMED:归一化相关系数匹配方法。
  • 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值
  • result(可选):输出的匹配结果矩阵,大小为(W-w+1, H-h+1),其中(W, H)是原始图像的大小,(w, h)是模板图像的大小。
  • mask(可选):用于指定感兴趣区域的掩码图像,与原始图像和模板图像具有相同的大小。

返回值:

  • 如果省略了result参数,则返回一个包含匹配结果的矩阵。
  • 如果指定了result参数,则将匹配结果存储在result中,并返回None。

注意:

  • image和template必须具有相同的数据类型(通常为uint8或float32)和通道数。
  • template的大小通常应小于或等于image的大小,否则可能无法找到匹配。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('pic1.jpg', 0)
img2 = img.copy()
template = cv.imread('template.jpg', 0)
w, h = template.shape[::-1]
# 列表中所有的6种比较方法
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
           'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
    img = img2.copy()
    method = eval(meth)
    # 应用模板匹配
    res = cv.matchTemplate(img, template, method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    # 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv.rectangle(img, top_left, bottom_right, 255, 2)
    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(img, cmap='gray')
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

在这里插入图片描述
在这里插入图片描述
以上是较为准确的结果

多对象的模板匹配

搜索具有多次出现的对象时,cv.minMaxLoc()不会为您提供所有位置。在这种情况下,我们将使用阈值化。

与之前的示例类似,但是不再使用cv.minMaxLoc()函数。相反,它直接使用了阈值化方法来筛选匹配结果,并获取满足阈值条件的位置坐标。

threshold = 0.8
loc = np.where( res >= threshold)

在这个示例中,我们设置了一个阈值为0.8,对应于匹配结果的相似度。然后,使用np.where()函数找到满足阈值条件的坐标位置,并在原始图像上绘制矩形框来标记匹配到的对象。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值