使用层次聚类在结构点云中进行平面的快速提取

来源:互联网 发布:制作新闻的软件 编辑:程序博客网 时间:2024/06/07 05:30

在许多机器人应用的领域,能够实时在三维点云中进行平面提取是非常困难的。在论文中提出了一个算法,能够在类似Kinect 传感器采集到的点云进行实时可靠的多平面的检测。

具体的算法一共有三个步骤:
第一步:生成图模型(每一个节点都代表的是一个点集,每条边代表点集之间的关系);
第二步:在构建好的图模型上利用层次聚类的方法进行点集的的融合,直到平面拟合的均方误差超过设定的阈值;
第三步:使用像素级别的局域增招,对上一步提取到的平面进行优化。

论文中演示了该算法在640x480的点云中,以超过35Hz的帧率对场景中所有主要的平面进行可靠的检测。

主流的几类平面提取的方法有:
(1)RANSAC-based methods:long computation time;
(2)Region-grow-based methods(pixel、voxel、line);
(3)turn into normal space, compute the distance between the point cloud and the original;
(4)normal estimation;
(5)Graph-based segmentation;

paper中也是使用图来表达数据之间的关系,但是还是与之前图模型的方法有一定的区别的:1)没有RGB的信心;2)不用对每个点进行发现估计;3)对节点与节点之间的边使用动态的权重

paper中还提到线回归和3D点云的平面提取的区别主要有两点:1)节点是没有重叠性的,节点与节点之间是没有共同的点的;2)尝试融合的次数,会高于线回归,因为线回归只要左右两端进行融合尝试就可以了,但是在三维点云中至少有上下左右四个方向的融合尝试,如果是 比较大的聚类,融合尝试的此时可能会更加多一些。

下面就对算法的三个步骤进行详细的描述:

1.图模型的初始化
将图像中的点云均匀的分成H×W为一个节点,例如图像为10×10,H=W=5,那么就分成(10/5)×(10/5)=4,总共分成四块,也就是有四个节点。但是根据paper中为了更好的使用AHC(层次聚类),需要移除下面几类节点和它们对应的边:

1)节点对应很高的MSE
2)节点缺少数据信息(传感器的限制)
3)节点包含的深度不连续
4)节点在两个平面的边界上

值得一提的是针对这种非重叠的节点,默认是在一个平面上的,所以也就不需要对每个节点中的点进行法线估计,这会很大的提高整个算法的速度。

2.层次聚类(AHC)

1)首先先建立一个最小堆的数据结构,使得能够更有效的找到有最小均方误进行融合;
2)再次计算融合后的平面拟合均方误差,找到获得均方误差最小的对应两个节点;
3)如果均方误差超过一个预先设定的阈值(非固定),一个平面的分割节点就算是找到了,把它从图中提取出来,否则,就把这两个节点融合好,重新加到构建的图中,对建立的最小堆进行更新;
4)重复上述2)、3)操作。

因为最小堆建立,可以被看成是一个近似的完全二叉树,所以在建立最小堆的复杂度是线性时间复杂度,而在排序的时候就是一个O(nlgn)的时间复杂度

3.分割优化
在步骤2层次聚类后只能算是比较粗糙的分割,而且在第一个步骤中我们舍弃了很多节点,所以在最后的优化时,我们是基于像素点的优化,主要是有下面三种类型:

1)在边缘处会产生锯齿状的分割:会使得少量异常点包含在估计中,通过腐蚀边界区域优化这种现象;
2)未使用的数据点:就近分类未使用的点周围平面;
3)过度分割:在特别小的图中(通常是小于30个节点)再次进行AHC。

参考文献:
[1]Feng C, Taguchi Y, Kamat V R. Fast plane extraction in organized point clouds using agglomerative hierarchical clustering[C]// IEEE International Conference on Robotics and Automation. IEEE, 2014:6218-6225.