gpt4 book ai didi

c++ - 从点云中检测一组平面

转载 作者:太空狗 更新时间:2023-10-29 23:44:31 25 4
gpt4 key购买 nike

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

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

最佳答案

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

  1. 正确的方法:使用 3D 最近邻查询数据结构(如 KD 树)来获取距查询点一小段距离内的所有点。
  2. 草率但更快的方法:使用随机选择的像素的像素网格邻域。这可能包括在 3D 中远离它的点,因为它们位于不同的平面/对象上,但这没关系,因为该像素不会从数据中获得太多支持。

下一步是根据该组 3D 点生成平面方程。您可以在它们的 3D 坐标上使用 PCA 来获得定义平面的两个最重要的特征向量(最后一个特征向量应该是法线)。

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

编辑:

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

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

关于c++ - 从点云中检测一组平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28731442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com