需要源码和图片请点赞关注收藏后评论区留言私信~~~
一、多模板匹配
匹配过程中同时查找多个模板的操作叫做多模板匹配,多模板匹配实际上就是进行了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()方法,这个方法返回的就是单目标匹配的最优结果。对于多目标匹配,读者朋友要将它和多模板匹配区分开:多目标匹配只有一个模板,而多模板匹配则有多个模板
创作不易 觉得有帮助请点赞关注收藏~~~