给定一个点云,比如深度传感器,我们想将局部的点分组/聚合在一起,这时我们就需要聚类算法。open3d实现了DBSCAN[Ester1996] 算法,这是一种基于密度的聚类算法。(百度百科链接具有对该算法的介绍,但建议看原论文)。该算法接口为cluster_dbscan,有两个必须的参数:eps表示聚类的领域距离,min_points表示聚类的最小点数。该函数返回一个label,其中label为-1表示为噪声。
代码展示
# -*-coding:utf-8 -*-
import os
import open3d as o3d
import matplotlib.pyplot as plt
import numpy as np
test_data_dir = '/home/pi/PycharmProjects/learn/Open3D/examples/test_data'
point_cloud_file_name = 'fragment.ply'
point_cloud_file_path = os.path.join(test_data_dir, point_cloud_file_name)
# 读取点云
pcd = o3d.io.read_point_cloud(point_cloud_file_path)
# 使用聚类算法
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))
# 求点云的聚类数量
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
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_geometries([pcd],
zoom=0.455,
front=[-0.4999, -0.1659, -0.8499],
lookat=[2.1813, 2.0619, 2.0999],
up=[0.1204, -0.9852, 0.1215])
效果展示