当前位置:   article > 正文

基于PCA的分割 代码实现思路总结 (C++)_c++通过pca计算法向量

c++通过pca计算法向量

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>>  Eu
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/221999
推荐阅读
相关标签
  

闽ICP备14008679号