赞
踩
算法核心:该算法是基于点法线之间角度的比较,企图将满足平滑约束的相邻点合并在一起,以一簇点集的形式输出。每簇点集被认为是属于相同平面。
基于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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。