关键代码:
labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))
point_cloud_dbscan_clustering.py
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
if __name__ == "__main__":
# 1. read pcd
sample_ply_data = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(sample_ply_data.path)
# Flip it, otherwise the pointcloud will be upside down.
"""
[
[1, 0, 0, 0],
[0, -1, 0, 0],
[0, 0, -1, 0],
[0, 0, 0, 1]
]
"""
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
# 2. cluster_dbscan. 聚类
"""
eps. Density parameter that is used to find neighbouring points.
min_points. Minimum number of points to form a cluster.
print_progress (default False). If 'True' the progress is visualized in the console.
return: label. 每个点都有类别值
"""
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:
labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))
# 3. view:
max_label = labels.max() # 最大的类别值
print(f"point cloud has {max_label + 1} clusters")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = 0 # 类别为0的,颜色设置为黑色
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3]) # ndarray to vector3d
o3d.visualization.draw([pcd])