从点云中检测一组平面

时间:2015-02-25 23:06:27

标签: c++ image-processing computer-vision point-clouds

我有一套点云,我想测试3D房间是否有角落。所以我想讨论我的方法,如果在速度方面有更好的方法,因为我想在手机上测试它。

我将尝试使用hough tranform来检测线条,然后我将尝试查看是否有三条相交的线条,它们也构成了一条相交的两个平面。

3 个答案:

答案 0 :(得分:6)

如果点云数据来自深度传感器,那么您的墙壁采样相对密集。我发现与深度传感器(例如Kinect或DepthSense)配合良好的一件事是@MartinBeckett建议的RANSAC程序的强大版本。 不是随机选择3个点,而是随机选择一个点,并获得云中的相邻点。有两种方法可以做到这一点:

  1. 正确的方法:使用3D最近邻查询数据结构(如KD树)来获取距查询点一小段距离内的所有点。
  2. 草率但更快的方式:使用随机选择的像素的像素网格邻域。这可能包括3D中远离它的点,因为它们位于不同的平面/对象上,但没关系,因为这个像素不会得到数据的大量支持。
  3. 下一步是从该组3D点生成平面方程。您可以在3D坐标上使用PCA来获得两个最重要的特征向量,这些特征向量定义了平面(最后一个特征向量应该是正常的)。

    从那里,RANSAC算法照常进行:检查数据中有多少其他点靠近该平面,并找到具有最大支持的平面。我发现最好找到最大的支撑平面,移除支撑的3D点,然后再次运行算法以找到其他“较小”的平面。通过这种方式,您可以获得房间内的所有墙壁。

    修改

    为了阐明上述内容:假设平面的支持是所有3D点的集合,其与该平面的距离最多为某个阈值(例如10cm,应取决于深度传感器的测量误差模型)。 在每次运行RANSAC算法之后,选择具有最大支持的平面。通过在支持集上执行PCA /线性回归,可以使用支持该平面的所有点来细化平面方程(这比仅使用相邻点更稳健)。

    为了继续并找到其他平面,应该从3D点集中移除前一次迭代的支持,以便剩余的点位于其他平面上。只要有足够的点并且最佳平面拟合误差不是太大,这可以重复。 在你的情况下(寻找角落),你需要至少3个垂直平面。如果你发现两个大支撑的平面大致平行,那么它们可能是地板和一些柜台,或两个平行的墙。房间没有可见的角落,或者您需要继续寻找具有较小支撑的垂直平面。

答案 1 :(得分:3)

正常方法是ransac

  1. 随机挑选3分。
  2. 制作一架飞机。
  3. 检查每个其他点是否位于飞机上。
  4. 如果飞机上有足够的空间 - 从所有这些点重新计算最佳飞机并将其从集合中移除
  5. 如果没有尝试另外3分
  6. 当你有足够的飞机或剩下的分数太少时停止。
  7. 如果您知道飞机接近垂直或接近水平,则采用另一种方法。

    1. 选择一个小的垂直范围
    2. 获取此范围内的所有积分
    3. 尝试并适合2d行
    4. 重复其他Z范围
    5. 如果你在每个Z切片中得到一组平行线,那么它们可能有一个平面 - 重新计算这些点的最佳拟合平面。

答案 2 :(得分:0)

我首先要指出

即使这是一篇旧帖子,我想提出一种类似于霍夫投票的补充方法,共同找到由平面交叉点组成的所有角落位置:

  1. 对空间进行均匀采样。确保点之间至少有一段距离$ d $(例如,您甚至可以使用'空间'子采样来实现云计算)
  2. 在这些点计算点云法线。
  3. 从这个下采样的云中随机选择3分。
  4. 每个定向点(点+平面)定义一个假设平面。因此,每挑选3个点定义3个平面。这些平面如果不平行且不在一条直线上相交,则总是在一个点上相交。
  5. 创建一个投票空间来描述角落:3个平面(点)的交点可能是有效的参数化。所以我们的参数空间有3个自由参数。
  6. 每3分在累加器空间投票到角点。
  7. 转到(2)并重复直到所有采样点都耗尽,或者完成足够的迭代。通过这种方式,我们将为所有可能的角落位置投票。
  8. 获取累加器空间的局部最大值。根据投票,我们将选择从最大平面的交叉点(因为它们将获得更多投票)到小平面的交叉点。最大的4个可能是房间的角落。如果没有,人们也可以考虑另一个本地最大值。
  9. 请注意,投票空间是量化的3D空间,角落位置将是实际值的粗略估计值。如果需要,可以将平面交叉点存储在该位置并对其进行细化(使用类似于ICP等的迭代优化)以获得非常精细的角落位置。

    这种方法非常快,可能非常准确,因为您可以优化位置。我相信它是目前为止提出的最佳算法。当然,这假设我们可以计算点云的法线(我们总是可以在协方差矩阵的特征向量的帮助下在样本位置处这样做。)

    请看这里,我在stackoverflow上列出了平面拟合相关问题: 3D Plane fitting algorithms