【编程实践】利用open3d对点云进行聚类并可视化
功能:对点云进行DBSCAN聚类,可视化聚类结果并统计噪声比例。
输入:DungouCut.pcd点云文件。
输出:聚类数量、噪声比例及彩色可视化结果。
注意:eps和min_points需根据点云密度调整。
调优方向:通过average_distance动态设置eps,或网格搜索最佳参数组合。
# -*- coding: utf-8 -*-
"""
Created on Jan 27 16:39 2025@author: zhiyang
"""
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
cloud_in = o3d.io.read_point_cloud('data_input\\DungouCut.pcd')
cloud_points = np.asarray(cloud_in.points)
kdtree = o3d.geometry.KDTreeFlann(cloud_in)
distances = []for i in range(len(cloud_points)):[_, idx, d] = kdtree.search_knn_vector_3d(cloud_in.points[i], 2)diatance = np.sqrt(d[1])distances.append(diatance)
average_distance = np.mean(distances)eps = 10 * average_distance
min_points = 10
labels = np.array(cloud_in.cluster_dbscan(eps = eps, min_points = min_points, print_progress = True))
max_label = labels.max()
print(f"聚类数量:{max_label+1}")
print(f"噪声比例:{np.sum(labels == -1) / len(labels):.3f}")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = [0,0,0,1]
cloud_in.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_geometries([cloud_in])
运行所需要依赖第三方库如下:
# reqiurements.txt
matplotlib==3.7.5
numpy==1.24.3
numpy==1.24.4
open3d==0.17.0
pyvista==0.44.2
scikit_learn==1.3.2
运行结果如下: