import math import numpy as np from sklearn.cluster import DBSCAN import cv2 colors_8 = [(255, 255, 255), # White(255, 0, 0), # Red(0, 255, 0), # Lime(0, 0, 255), # Blue(255, 255, 0), # Yellow(0, 255, 255), # Cyan(255, 0, 255) # Magenta ]# 计算自定义的距离度量 def line_distance(line1, line2):x1, theta1 = line1x2, theta2 = line2x_dis = x2 - x1if abs(x_dis) < 2:x_dis = 0return math.sqrt(x_dis ** 2 + (theta1 - theta2) ** 2)# DBSCAN 聚类 def dbscan_cluster(points, eps=4, min_samples=2):dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric=line_distance)dbscan.fit(points)return dbscan.labels_# 主函数 if __name__ == "__main__":# 给定的线段数据 (x1, y1, x2, y2)# lines = [(252, 65, 253, 6), # 点1: (265, 105), (268, 0)# (246, 62, 247, 7), # 点2: (246, 62), (247, 7)# (246, 60, 246, 5), # 点3: (246, 60), (246, 5)# ]##线下脚本lines = [(331 ,34, 333, 0),(328 ,32, 333, 126),(380 ,126, 380, 90),(329 ,61,331 ,119),(337 ,34 ,341, 80),(328 ,43 ,328, 74),]# # app# lines = [# (379 ,127 ,381, 0),# (332 ,32 ,333, 0),# ( 337, 35 ,341 ,77),# (330 ,117, 331 ,44),# (330, 68 ,331 ,15),# ]# # # 刀隔算法lines = [(328, 34 , 332 , 125),(334, 0 , 342, 81),(381 , 62, 381 , 24),(331 , 89 , 331 , 56),(337 , 9 , 342, 80),(379 , 5 , 379 , 61),(337, 35 , 341 , 82),(330 , 70, 330, 28),(329 , 80, 330, 113),]##刀尖角度未识别target_points= [ (84 , 62),(85, 63),(85 , 97), ( 64 , 125),(65, 125),(62, 126),(63, 12),(60, 127),(61, 127),]if 0:dbscan_labels = dbscan_cluster(target_points)# 打印 DBSCAN 聚类标签print("DBSCAN 聚类标签:", dbscan_labels)# 获取所有唯一的聚类标签unique_labels = np.unique(dbscan_labels)# 创建一个空白图像用于显示image = np.ones((600, 600, 3), dtype=np.uint8) * 255 # 白色背景# 绘制聚类点# 绘制每个点并根据聚类标签上色for i, label in enumerate(dbscan_labels):color = colors_8[label] # 确保颜色循环point = target_points[i]cv2.circle(image, point, 5, color, -1) # 绘制圆点,半径5,填充颜色if 1 :# 极坐标转换lines_polar = []for line in lines:x1, y1, x2, y2 = linedx = x2 - x1dy = y2 - y1if dx == 0:x_value_when_y_0 = x1if dy != 0:angle_radians = math.pi / 2 # 对应90度,转换为弧度制为pi/2else:angle_radians = 0else:slope = (y2 - y1) / (x2 - x1)if slope == 0:x_value_when_y_0 = x1else:x_value_when_y_0 = x1 - y1 / slopem = dy / dxangle_radians = math.atan(m)lines_polar.append((x_value_when_y_0, angle_radians))lines_polar = np.array(lines_polar)points = np.array(lines_polar)print("聚类后的点", points)dbscan_labels = dbscan_cluster(points)# 打印 DBSCAN 聚类标签print("DBSCAN 聚类标签:", dbscan_labels)image = np.zeros((500, 500, 3), dtype=np.uint8)# 获取所有唯一的聚类标签unique_labels = np.unique(dbscan_labels)# 遍历每个点并绘制for i, label in enumerate(dbscan_labels):color = colors_8[label]line =lines[i]x1, y1, x2, y2 = linecv2.line(image, (x1, y1), (x2, y2), color, 2)# 显示图像cv2.imshow('Clustered Points', image)cv2.waitKey(0)cv2.destroyAllWindows()