【python】【opencv】【模板匹配】【检测框坐标清洗】【欧氏距离法】【去除冗余坐标框】-爱代码爱编程
模板匹配后冗余检测框太多用欧氏距离法去除冗余检测框
最近在用openCV实现多模板匹配时,为了更多的检测出目标,将相似度阈值设置的比较低,发现匹配后的冗余检测框太多,利用欧氏距离法将距离小于某个阈值的坐标框去除,发现效果还不错。
一、使用欧氏距离法之前
因为相似度阈值设置低,图片中出现很多检测框冗余堆叠的问题。
二、使用欧氏距离法之后
冗余的检测框都被去掉。
2.1欧氏距离
欧氏距离定义: 欧氏距离( Euclidean distance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。
在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是:
三维的公式是:
三、代码如下
下面展示一些 内联代码片
。
img_yuan = cv2.imread('D:/hagongda/xue.jpg')#读取原图像
#小编在之前将原图预先进行了灰度化再二值化处理
img_gray = cv2.imread('D:/hagongda/xue1.jpg')#读取原图形二值图
template = cv2.imread('D:/hagongda/xue2.png')#读取模板二值图
h,w = template.shape[:2] #拿到模板的宽高
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)#进行模板匹配
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
threshold = 0.4#设置相似度阈值
#取匹配程度大于40%的坐标
loc = np.where(res >= threshold)
#利用欧氏距离消除冗余坐标
threshold1 = 25 #设置欧氏距离阈值
new_points = []# 新坐标点列表
# 遍历每个坐标点
for pt in zip(*loc[::-1]):#对模板匹配后得到的坐标点(x,y)遍历
# 是否相近的标志
is_close = False
# 遍历已经处理过的坐标点
for new_point in new_points:
# 计算欧几里得距离
distance = math.sqrt((pt[0]-new_point[0])**2 + (pt[1]-new_point[1])**2)
# 如果距离小于阈值,则认为相近
if distance < threshold1:
is_close = True
break
# 如果不相近,则将该点添加到新列表中
if not is_close:
new_points.append(pt)
#在原图像上进行坐标框绘制
img3 = img_yuan.copy()
for i in range(len(new_points)):
bottom_right = (new_points[i][0]+h,new_points[i][1]+w)#得到右下角坐标
cv2.rectangle(img3,new_points[i],bottom_right,(0,0,0),1)#进行矩形框绘制
cv2.imshow('result',img3)
cv2.waitKey(0)