OpenCV多模板匹配讲解与匹配汽车实战(附Python源码)

需要源码和图片请点赞关注收藏后评论区留言私信~~~

一、多模板匹配

匹配过程中同时查找多个模板的操作叫做多模板匹配,多模板匹配实际上就是进行了n次单模板多目标匹配操作,n的数量为模板总数

实战1:同时匹配三个不同的模板

每一个模板都要做一次单模板多目标匹配,最后把所有模板的匹配结果汇总到一起,单模板多目标匹配的过程可以封装成一个方法,方法参数为模板和原始图像,方法内部将计算结果再加工以下,直接返回所有红框左上角和右下角两点横纵坐标的列表,在方法之外,将所有模板计算得出的坐标汇总到一个列表中,按照这些汇总的坐标一次性将所有红框都绘制出来 效果如下

其中模板就是里面的三个图像

部分代码如下

import cv2

def myMatchTemplate(img, templ):  # 自定义方法:获取模板匹配成功后所有红框位置的坐标
    width height, c = templ.hape  # 获取模板图像的宽度、高度和通道数
    results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)  # 按照标准相关系数匹配
    loc = list()  # 红框的列表
    for i in range(len(results)):  # 遍历结果数组的行            if results[i][j 0.99:  # 如果相关系数大于0.99则认为匹配成功
                # 在列表中添加匹配 j + width, i + height))
    return lo

img = cv2.imread("background2.jpg")  # 读取原始图像
templs = list()  # 模板列templs.append(cv2.imread("template.png"))  # 添加模板1
templs.append(cv2.imr=d("tempe2.=png"))  # 添加模板2
templs.append(cv2.imr=ead("template3.png"))  # 添加模板3
=
loc = list()  # 所有模板匹配成功位置的红框坐标列表
for t in templs:  # 遍历所有模板
    loc += myMatchTemplate(img, t)  # 记录该模板匹配得出的

for i in loc:  # 遍历所红框的坐标
    cv2.rectanglimg, (i[0], i[1]), (i[2], i[3]), (0, 0, 255), 2)  # 在图片中绘制红框

cv2.imshow("img", img)  # 显示匹配的结果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

 使用多模板匹配能够解决很多生活中的实际问题,例如一个收费停车场有四个车位,车位上陆续地停放了四辆车,通过多模板匹配,能够知晓这四辆车分别停在了哪个车位上,接下来模拟这一生活场景

实战2:使用多模板匹配让控制台判断四辆车分别停在了哪个车位上

模板图如下

其中车的顺序是橙色-蓝色-红色-绿色

输出结果如下

 

 可见正确的判断了不同车处于哪个停车位上

部分代码如下

import cv2

image = cv2.imread("image.png")  # 读取原始图像
templs = []  # 模板列表
templs.append(cv2.imread("car1.png"))  # 添加模板图像1
templs.append(cv2.("car2.png"))  # 添加模板图像2
templs.aend(cv2.imread("car3.png"))  # 添加模板图像3
templs.append(cv2.imread("car4.png"))  # 添加模板图像3
for car in tems:  # 遍历所有模板图像
    # 按照标准相关系数匹配
    results = cv2.matchTemplate(image, car, cv2.TM_CCOEFF_NORMED)
    for i in range(len(results)):  # 遍历结果数组的行
        for j in range(n(results[i])):  # 遍历结果数组的列
            # print(results[i][j])
            if results[i]] > 0.99:  # 如果相关系数大于0.99则认为匹配成功
                if 0 < j  140:
                    print("车位编号:", 1)
                elif j <= 330:
                    print("车位编号:", 2)
                elif j <= 500:
                    print("车位编号:", 3)
                else:
                    print("车位编号:", 4)
                break

总结

模板匹配包括单模板匹配和多模板匹配,单模板匹配又包括单目标匹配和多目标匹配。实现这些内容的基础方法就是模板匹配方法,即matchTemplate()方法。其中,读者朋友重点掌握模板匹配方法的6个参数值。此外,为了实现单目标匹配,除了需要使用模板匹配方法matchTemplate()外,还要使用minMaxLoc()方法,这个方法返回的就是单目标匹配的最优结果。对于多目标匹配,读者朋友要将它和多模板匹配区分开:多目标匹配只有一个模板,而多模板匹配则有多个模板

创作不易 觉得有帮助请点赞关注收藏~~~

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
Python中使用OpenCV进行模板匹配可以通过matchTemplate函数来实现。该函数的原型为:matchTemplate(image, templ, method\[, result\[, mask\]\]) -> result。\[3\]其中,image是待搜索的图像,templ是要匹配的模板图像,method是匹配方法,result是输出的匹配结果,mask是可选的掩码图像。\[3\] 下面是一个使用OpenCV进行多对象模板匹配的示例代码: ```python import cv2 import numpy as np img_rgb = cv2.imread('Coins.jpg') img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template = cv2.imread('Coin.jpg', 0) w, h = template.shape\[::-1\] res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) threshold = 0.4 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("img", img_rgb) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了待搜索的图像和要匹配的模板图像,并将待搜索图像转换为灰度图像。然后,我们使用matchTemplate函数进行模板匹配,并设置了匹配阈值为0.4。最后,我们使用cv2.rectangle函数在匹配到的位置上绘制矩形框,将结果显示出来。\[1\] 希望这个示例能帮助到你进行OpenCV Python模板匹配。 #### 引用[.reference_title] - *1* [OpenCV - 模板匹配Python实现)](https://blog.csdn.net/qq_40344307/article/details/95111626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【OpenCV + Python模板匹配](https://blog.csdn.net/zhouzongzong/article/details/93761729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值