PCL分割——欧几里得聚簇

该算法通过距离连通性作为判据,从任意种子点出发,利用近邻搜索不断向外扩展,最终将点云划分为多个空间上彼此独立的连通点云簇。

算法流程

1️⃣ 构建空间搜索结构
对输入的无组织点云 (P) 构建 Kd-tree,用于后续高效的邻域(半径)搜索。
2️⃣ 初始化容器
初始化一个空的聚类集合 (C),以及一个用于存放当前待处理点的队列Q,同时标记所有点为“未处理”。
3️⃣ 选择种子点并开始生长
从点云中选取一个尚未处理的点作为种子点,将其加入队列Q。
4️⃣ 基于距离的邻域扩展
对队列 (Q) 中的每一个点:

  • 在半径 \(r < d_{th}\) 的球形邻域内查找近邻点;
  • 对满足距离条件且尚未处理的邻域点,将其加入队列Q,并标记为已处理;
  • 新加入的点继续参与邻域搜索,形成类似“洪水填充”的扩展过程。

5️⃣ 形成簇并遍历全部点云
当队列Q中不再有新点加入时,将Q作为一个完整的点云簇加入集合C,清空Q,并从下一个未处理点重新开始,直到所有点都被划分到某个簇中。

使用示例
// 使用KdTree进行半径搜索
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud (cloud_filtered);

std::vector<pcl::PointIndices> cluster_indices;
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance (0.02); // 2cm
ec.setMinClusterSize (100);
ec.setMaxClusterSize (25000);
ec.setSearchMethod (tree);
ec.setInputCloud (cloud_filtered);
ec.extract (cluster_indices);
posted @ 2025-12-14 20:49  Ytytyty  阅读(44)  评论(0)    收藏  举报