OpenCV for Python之模板匹配

Opencv4 官方文档 : https://docs.opencv.org/4.2.0/
Opencv4 for Python中文文档点击下载:OpenCV4 for Python 中文文档

1 模板匹配

在整个图像区域发现与给定子图像匹配的小块区域具体实现为在待检测的图像上,从左到右,从上倒下计算模板图像与重叠子图像匹配度,匹配度越大,两者相同的可能性越大,例如滑动验证码的缺口小图与缺口大图。
在这里插入图片描述

2 api及其参数

cv.matchTemplate(image, templ, method, result=None, mask=None)

参数:

  • image: 输入图片1,图中包含模板的图片;
  • templ: 输入图片2,模板图片。size必须小于image;
  • method:采用何种匹配方式;
  • result:比较结果的映射图像,必须是单通道32位浮点格式;
  • mask: 搜索模板的mask(不知道咋翻译会好一点),它必须与templ具有相同的类型和大小。 默认情况下未设置。 当前,仅支持#TM_SQDIFF和#TM_CCORR_NORMED方法。

3 常见匹配方式及其计算公式

不深研究…
在这里插入图片描述

4 匹配单个物体

为了展示 效果,这里先将原图和模板放出
image:
在这里插入图片描述
templates:
在这里插入图片描述
demo:

def template_demo():
    tpl = cv.imread("./files/images/match2.png")
    target = cv.imread("./files/images/match1.png")

    methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_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:  # cv.TM_SQDIFF_NORMED最小时最相似,其他最大时最相似
            tl = min_loc
        else:
            tl = max_loc

        br = (tl[0] + tw, tl[1] + th)
        cv.rectangle(target, tl, br, (0, 0, 255), 2)  # tl为左上角坐标,br为右下角坐标,从而画出矩形
        cv.imshow("match-"+np.str(md), target)

result:
在这里插入图片描述

5 匹配多个物体

iamge:
在这里插入图片描述
temp:
在这里插入图片描述
demo:

def template_demo_more():
    img_rgb = cv.imread('./files/images/temp1.jpg')
    img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
    template = cv.imread('./files/images/temp2.jpg', 0)
    h, w = template.shape[:2]

    res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
    threshold = 0.8

    loc = np.where(res >= threshold)  # 匹配程度大于%80的坐标y,x
    print(loc)
    for pt in zip(*loc[::-1]):  # *号表示可选参数
        right_bottom = (pt[0] + w, pt[1] + h)
        cv.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2)
        cv.imshow("more",img_rgb)

result:

转载请注明转自:https://leejason.blog.csdn.net/article/details/106450141

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值