python+opencv3.3视频教学笔记 15 模板匹配

模板匹配是通过模板在采集到的原图像进行滑动寻找与模板图像相似的目标。模板匹配不是基于直方图的方式,而是基于图像的灰度匹配。其基本原理是逐像素的把一个以一定大小的实时图像窗口的灰度矩阵与参考图像的所有可能的串口灰度阵列,按照某种相似度量方法进行搜索比较的匹配方法,从理论上说就是采用图像相关技术。

为了利用模板匹配从源图像中得到匹配区域,从源图像选取该区域作为进行匹配的模板。模板从源图像左上角开始每次以一个像素点为单位进行移动,每到达一个位置,就会计算模板矩阵和源图像当前位置矩阵匹配的“好”“坏”程度即两个矩阵的相似程度,模板滑动与源图像匹配过程中,将模板和当前模板覆盖区域的矩阵的计算结果存储在矩阵®中。R中每一个位置(x, y)都包含了匹配矩阵的计算结果。在OpenCV中提供了6种匹配度量方法:
平方差匹配法CV_TM_SQDIFF
归一化平方差匹配法CV_TM_SQDIFF_NORMED
相关匹配法CV_TM_CCORR
归一化相关匹配法CV_TM_CCORR_NORMED
系数匹配法CV_TM_CCOEFF
化相关系数匹配法CV_TMCCOEFF_NORMED

通常来讲,随着从简单测量方法(平方差)到更复杂的测量方法(相关系数法),我们可以获得越来越准确的匹配。然而这同时也会以越来越大的计算量为代价
注意
值得注意的是对于方法SQDIFF和SQDIFF_NORMED两种方法来讲,越小的值就有着更高的匹配结果,而其余的方法则是数值越大匹配效果越好

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


def template_demo():
    tpl = cv.imread("D:/opencv/template.jpg")
    target = cv.imread("D:/opencv/target.jpg")
    cv.imshow("template", tpl)
    cv.imshow("target", target)
    methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCOEFF_NORMED, cv.TM_CCORR_NORMED]
    th, tw = tpl.shape[:2]
    for md in methods:
        print(md)
        result = cv.matchTemplate(target, tpl, md)
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
        if md == cv.TM_SQDIFF_NORMED:
            tl = min_loc  # tl是矩阵左上角的点的坐标
        else:
            tl = max_loc
        br = (tl[0]+tw, tl[1]+th)  #br是矩形右下角的点的坐标
        cv.rectangle(target, tl, br, (0, 0, 255), 2)
        cv.imshow("match-"+np.str(md), target)


print("--------- Hello Python --------")
template_demo()
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV中提供了matchTemplate()并配合minMaxLoc()函数实现图像的模板匹配过程。通过matchTemplate()函数根据输入模板搜寻输入图像中与模板相似的地方,获得匹配结果图像。通过minMaxLoc()函数来找到最大值和最小值.

matchTemplate
函数原型为:matchTemplate(image, templ, method[, result[, mask]]) -> result

image参数表示待搜索源图像,必须是8位整数或32位浮点。
templ参数表示模板图像,必须不大于源图像并具有相同的数据类型。
method参数表示计算匹配程度的方法。
result参数表示匹配结果图像,必须是单通道32位浮点。如果image的尺寸为W x H,templ的尺寸为w x h,则result的尺寸为**(W-w+1)x(H-h+1)**
可以看到代码中的例图是符合上述公式的

print("target shape =", target.shape)
print("template shape =", tpl.shape)
print("result shape =", result.shape)

>>>
target shape = (667, 500, 3)
template shape = (192, 212, 3)
result shape = (476, 289)

minMaxLoc
在给定的矩阵中寻找最大和最小值,并给出它们的位置。 该功能不适用于多通道阵列。 如果您需要在所有通道中查找最小或最大元素,要先将阵列重新解释为单通道。

minMaxLoc(src[, mask]) -> minVal, maxVal, minLoc, maxLoc

src参数表示输入单通道图像。
mask参数表示用于选择子数组的可选掩码。
minVal参数表示返回的最小值,如果不需要,则使用NULL。
maxVal参数表示返回的最大值,如果不需要,则使用NULL。
minLoc参数表示返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。
maxLoc参数表示返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL。
rectangle
用于绘制矩形

rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img

img参数表示源图像。
pt1参数表示矩形的一个顶点。
pt2参数表示与pt1相对的对角线上的另一个顶点 。
color参数表示矩形线条颜色 (RGB) 或亮度(灰度图像 )。
thickness参数表示组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
lineType参数表示线条的类型。
shift参数表示坐标点的小数点位数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值