需要源码和图片请点赞关注收藏后评论区留言私信~~~
多目标匹配
多目标匹配需要将原始图像中所有与模板相似的图像都找出来,使用相关匹配或者相关系数匹配可以很好的实现这个功能,如果计算结果大于某值,则认为匹配区域的图案和模板是相同的
实战1
为原始图片中所有匹配成功的图案绘制红框
结果如下图所示 左边的为模板图片 右边的是在原始图片中匹配到了三个与模板图片相似的图片,并且用红框圈出
代码如下
import cv2 img = cv2.imread(".jpg") # 读取原始图像 templ = cv2.imread("template.png") # 读取模板图像 width, height, c = empl.shape # 获取模板图像的宽度、高度和通道数 results = cv2.matchemplate(img, templ, cv2.TM_CCOEFF_NORMED) # 按照标准相关系数匹配 for y in range(len(results)): # 遍历结果数组的行 for x in range(ln(results[y])): # 遍历结果数组的列 if results[y][x] > 0.: # 如果相关系数大于0.99则认为匹配成功 # 在最佳匹配结位置绘制红色方框 cv2.rectangimgx, y), (x + width, y + height), (0, 0, 255), 2) cv2.imshow("temp",templ) cv2.imshow("img, img) # 显示匹配的结果 cv2.waitKey() 任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
实战2
多目标匹配在生活中有很多应用场景 例如统计一条线路的站台总数
模板如下
在原始图像中标记线路的各个站台,统计这条线路的站台总数
代码如下
import cv2 image = cv2.imread("imag.png") # 读取原始图像 templ = cv2.imread("templp") # 读取模板图像 height, width, c = templhape # 获取模板图像的高度、宽度和通道数 results = cv2.matchTemplate(image, templ, cv2.TM_CCOEFF_NORMED) # 按照标准相关系数匹配 station_Num = 0 # 初始化快轨的台个数为0 for y in range(len(results)): # 遍历结果数组的行 for x in range(len(results[y):# 遍历结果数组的列 if results[y][x] > 0.99: # 如果相关系数大于0.99则认为匹配成功 # 在最佳匹配结果位置绘制蓝色矩形边框 cv2.rectangle(image, (x, y), (x + width, y + height), (255, 0, 0), 2) station_Num += 1 # 快轨的站台个数加1 cv2.putText(image, "the numbersof stations: " + str(station_Num), (0, 30), cv2.FONT_HERSHEY_COMPLEX_SMA, (0, 0, 255), 1) # 在原始图像绘制快轨站台的总数 cv2.imshow("temp",templ) cv2.imshow("result", image) # 显示匹配的结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
实战3
同一地点附近有两个地铁站,优先选择直线距离最短的地铁站
可以先在原始图像中标记出这两个地铁站,然后计算坐标与这两个地铁站之间的直线距离
我们将匹配结果用蓝色边框圈出,然后用绿色线段标出直线距离最短的地铁站
代码如下
import cv2 import numpy as np import ath image = cv2.imread("image.png") # 读取原始图像 templ =v2imead("templ.png") # 读取模板图像 height, width, c = teml.shape # 获取模板图像的高度、宽度和通道数 results = cv2.matchTemplate(image, templ, cv2.TM_CCOEFF_NORMED) # 按照标准相关系数匹配 point_X = [] # 用于存储最佳匹配结果左上角横坐标的列表for y in range(len(results)): # 遍历结果数组的行 for x in range(len(results[y])): # 遍历结果数组的列 if results[y][x] > 0.99: # 如果相关系数大于0.99则认为匹配成功 # 在最佳匹配结果位置绘制红色方框 cv2.rectangle(image, (x, y), (x + width, y + height), (255, 0, 0), 2) point_X.extend([x]) # 把最佳匹配结果左上角的横坐标添加到列表中 point_Y.extend([y]) # 把最佳匹配结果左上角的纵坐标添加到列表中 # 出发点的横、纵坐标 start_X = 62 start_Y = 150 # 计算出发点到人民广场地铁站的距离 place_Square = np.array([point_X[0], point_Y[0]]) place_Start = np.array([start_X, start_Y]) start_Square = math.hypot(minus_SS[0], minus_SS[1]) #出发点到大路地铁站的距离 place_Highad = array([point_X[1], point_Y[1]]) nu_HS = place_Highroad - place_Start start_Highroad = math.hypot(minus_HS[0], minus_HS[1]) # 用绿色的线画出距离较短的路线 if start_Square < start_Highroad: cv2.line(image, (start_X, start_Y), (point_X[0], point_Y[0]), (0, 255, 0), 2) else: cv2.line(image, (start_X, start_Y), (point_X[1], point_Y[1]), (0, 255, 0), 2) cv2.imshow("result", image) # 显示匹配的结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
创作不易 觉得有帮助请点赞关注收藏~~~