Open3D将聚类结果显示或者保存

文章介绍了对3D海绵点云数据进行聚类处理,使用DBSCAN算法识别不同区域,然后按照聚类大小排序并展示了最大的四个聚类结果。

将聚类结果按大小排序,并取出最大的4个结果 

import time
import open3d as o3d;
import numpy as np;
import matplotlib.pyplot as plt

#坐标
mesh_coord_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=355, origin=[0, 0, 0])
#mesh_coord_frame = mesh_coord_frame.translate((0.16, 0.15, 0)) 


#加载点云数据
ply = o3d.io.read_point_cloud("source/Foam1.ply") 

# downply = ply.voxel_down_sample(voxel_size=0.103)
# o3d.visualization.draw_geometries([ downply],window_name="downply") 

#去除无效部分
plane_model, inliers = ply.segment_plane(distance_threshold=1.6,
                                         ransac_n=3,
                                         num_iterations=1000)

[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")

inlier_cloud = ply.select_by_index(inliers) 

pcd = ply.select_by_index(inliers, invert=True) 
o3d.visualization.draw_geometries([ inlier_cloud],window_name="3D海绵点云无效数据") 
o3d.visualization.draw_geometries([ pcd],window_name="3D海绵点云有效数据") 
 
# 使用聚类算法
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:
    labels = np.array(pcd.cluster_dbscan(eps=3.3, min_points=1, print_progress=True))

print(labels)
# 求点云的聚类数量
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,mesh_coord_frame],window_name="3D海绵聚类") 


# Get the unique labels
unique_labels = np.unique(labels)

# Create a dictionary to store the cluster sizes
cluster_sizes = {}
for label in unique_labels:
    cluster_sizes[label] = np.count_nonzero(labels == label)

# Sort the dictionary by cluster size 排序取出最大的四个聚类结果
sorted_cluster_sizes = dict(
    sorted(cluster_sizes.items(), key=lambda item: item[1], reverse=True)[:4]
)

# Save the clustering results for each cluster in sorted order
for label, size in sorted_cluster_sizes.items():
    cluster_pcd = pcd.select_by_index(np.where(labels == label)[0])
    o3d.visualization.draw_geometries([ cluster_pcd,mesh_coord_frame],window_name="3D海绵聚类结果{}".format(size)) 
    # o3d.io.write_point_cloud(
    #     "path/to/clustered_point_cloud_{}.pcd".format(label), cluster_pcd
    # )

    # # Save the clustering results for each cluster in a specific format
    # o3d.io.write_point_cloud_ply(
    #     "path/to/clustered_point_cloud_{}.ply".format(label), cluster_pcd
    # )


 


 



 
 

 
 

聚类结果

最大的面积 结果

第二大面积结果

### 使用 Open3D 执行 KMeans 聚类Open3D 库中,可以利用 `open3d.ml` 模块下的工具来进行机器学习任务,包括 KMeans 算法的应用。然而需要注意的是,在早期版本的 Open3D没有直接提供专门针对点云数据集的 KMeans 函数接口;通常情况下会结合其他成熟的机器学习库如 scikit-learn 来完成这一操作[^1]。 对于最新版的 Open3D (0.17 及以上),确实引入了一些新的特性支持更便捷地处理点云聚类问题。下面给出基于当前可用功能的一个简单例子来展示如何使用 KMeans 对点云进行聚类分析: #### 参数说明 - `n_clusters`: 表示期望得到的簇数量。 - `init`: 初始化方法,默认为 'k-means++' ,也可以设置为中心点坐标数组。 - `max_iter`: 进行迭代的最大次数。 - `tol`: 收敛条件之一,即当中心位置变化小于该阈值时认为已经收敛。 - `random_state`: 随机种子,确保每次运行结果一致。 #### 示例代码 ```python import open3d as o3d from sklearn.cluster import KMeans import numpy as np # 加载点云文件转换成numpy array格式 pcd = o3d.io.read_point_cloud("path_to_your_pcd_file.ply") # 替换为实际路径 points = np.asarray(pcd.points) # 创建KMeans模型实例 km = KMeans(n_clusters=5, init='k-means++', max_iter=300, tol=0.0001, random_state=None) # 训练模型对原始点分配标签 labels = km.fit_predict(points) # 将聚类结果可视化 colors = plt.get_cmap("tab20")(labels / (labels.max() + 1)) pcd.colors = o3d.utility.Vector3dVector(colors[:, :3]) o3d.visualization.draw_geometries([pcd]) # 如果想要保存分类后的点云到新文件 o3d.io.write_point_cloud("clustered_output.ply", pcd) ``` 上述代码片段展示了从读取点云数据开始直到最终将带有颜色标记的不同类别点写入新PLY文件的过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值