算法更新: delivery v1.2.1、平整度v1.5、测距v2.2、整车配准v1.3 适配器: vehicle-registration 新增、各算法 manifest 和 adapter 更新 后端: taskCadFiles/source 字段迁移、derivedPointClouds 注册、取消任务联动 前端: ElapsedTime 时长显示、两步算法流程、canRun 逻辑修复 文档: 新增5份算法性能分析报告
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
import open3d as o3d
|
|
import numpy as np
|
|
|
|
|
|
def euclidean_clustering_open3d(pcd, radius=0.1, min_cluster_size=50, max_cluster_size=10000):
|
|
"""
|
|
使用 Open3D 进行欧几里得聚类
|
|
Args:
|
|
pcd: Open3D 点云对象
|
|
radius: 聚类半径
|
|
min_cluster_size: 最小簇大小
|
|
max_cluster_size: 最大簇大小
|
|
Returns:
|
|
labels: 每个点的簇标签(-1 表示噪声/无效簇)
|
|
clusters: 各簇的点索引列表
|
|
"""
|
|
# 欧几里得聚类
|
|
labels = np.array(pcd.cluster_dbscan(eps=radius, min_points=min_cluster_size))
|
|
|
|
# 统计簇信息
|
|
unique_labels = np.unique(labels)
|
|
clusters = []
|
|
|
|
for label in unique_labels:
|
|
if label == -1: # -1 表示噪声点
|
|
continue
|
|
cluster_indices = np.where(labels == label)[0]
|
|
if min_cluster_size <= len(cluster_indices) <= max_cluster_size:
|
|
clusters.append(cluster_indices)
|
|
|
|
return labels, clusters
|
|
|
|
|
|
# 使用示例
|
|
pcd = o3d.io.read_point_cloud("E:\point_distance\data\part_car_left_side.ply")
|
|
labels, clusters = euclidean_clustering_open3d(pcd, radius=4, min_cluster_size=100)
|
|
|
|
print(f"找到 {len(clusters)} 个聚类")
|
|
|
|
# 为每个聚类着色
|
|
colors = np.random.rand(len(clusters), 3)
|
|
colored_points = np.zeros((len(pcd.points), 3))
|
|
for i, cluster in enumerate(clusters):
|
|
colored_points[cluster] = colors[i]
|
|
|
|
pcd.colors = o3d.utility.Vector3dVector(colored_points)
|
|
o3d.visualization.draw_geometries([pcd]) |