基于PCA的分割 代码实现思路总结 (C++)

本文介绍了基于PCA的点云聚类算法,通过计算点的法向量和曲率,利用区域增长策略进行聚类。C++实现中,首先找到曲率最小的种子点,然后不断搜索满足条件的邻近点,直到所有点被聚类。这种方法在处理点法向量估算不准确时可能存在模糊性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、原理

算法核心:该算法是基于点法线之间角度的比较,企图将满足平滑约束的相邻点合并在一起,以一簇点集的形式输出。每簇点集被认为是属于相同平面。

基于C++实现过程:

(1)使用PCA计算所有点的法向量及曲率,找到曲率最小对应的点,将其添加到一簇点集中的种子点;

(2)构建存储种子点的容器CurrentPoints、一维数组指针标记flag,均默认为0,在增长判断中标记flag用于判断该点是否进行过区域增长。

(3)选取曲率最小点为初始种子点,并将其flag设置为1,搜索其近邻点,若曲率及法向量均满足条件,且falg=0的点,则将其添加到种子点集中CurrentPoints中。在下次while循环中从CurrentPoints中取出一点,且设置标记flag=1,且从CurrentPoints中剔除该点CurrentPoints.pop_back(),再次搜索近邻点、法向量与曲率判断,获取新的种子点,直至CurrentPoints中不再有点。则一个区域增长过程完成。

(4)对剩下的点重复步骤(3),直至所有点聚类完毕。

小结:区域增长算法效率非常高,但对于法向量估算不准确的地方,则存在模糊性。

下面一段代码为基于欧式距离的区域增长(其涉及到PCL中kdtree近邻点搜索):

std::vector<std::vector<pcl::PointXYZ>>  EuclideanCluster::EuclideanClusterDis(std::vector<pcl::PointXYZ>
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云实验室lab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值