我有一组点云,我想测试3D房间中是否有角落。所以我想讨论一下我的方法,以及在速度方面是否有更好的方法,因为我想在手机上测试它。
我将尝试使用霍夫变换来检测线,然后我将尝试查看是否有三条线相交,并且它们也形成了两个相交的平面。
如果点云数据来自深度传感器,那么您将获得相对密集的墙壁采样。我发现与深度传感器(例如 Kinect 或 DepthSense)配合良好的一件事是 @MartinBeckett 建议的 RANSAC 过程的强大版本。
不是随机选取 3 个点,而是随机选取一个点,并获取云中的邻近点。有两种方法可以做到这一点:
- 正确的方法:使用 3D 最近邻查询数据结构(例如 KD 树)来获取距查询点较小距离内的所有点。
- 草率但更快的方法:使用随机选择的像素的像素网格邻域。这可能包括 3D 中远离它的点,因为它们位于不同的平面/对象上,但这没关系,因为该像素不会从数据中获得太多支持。
下一步是从该组 3D 点生成平面方程。您可以在其 3D 坐标上使用 PCA 来获取定义平面的两个最重要的特征向量(最后一个特征向量应该是法线)。
从那里开始,RANSAC 算法照常进行:检查数据中还有多少其他点靠近该平面,并找到具有最大支持的平面。我发现最好找到最大的支撑平面,删除支撑 3D 点,然后再次运行算法以找到其他“较小”平面。这样你就可以得到你房间里的所有墙壁。
EDIT:
为了澄清上述内容:假设平面的支持是与该平面的距离最多为某个阈值(例如 10 厘米,应取决于深度传感器的测量误差模型)的所有 3D 点的集合。
每次运行 RANSAC 算法后,都会选择支持度最大的平面。通过在支持集上执行 PCA/线性回归,支持该平面的所有点都可以用于细化平面方程(这比仅使用相邻点更稳健)。
为了继续并找到其他平面,应从 3D 点集中删除先前迭代的支持,以便剩余点位于其他平面上。只要有足够的点并且最佳平面拟合误差不太大,就可以重复此操作。
在你的情况下(寻找一个角),你至少需要 3 个垂直平面。如果您发现两个具有大支撑的平面大致平行,那么它们可能是地板和一些柜台,或者两个平行的墙壁。要么房间没有可见的角落,要么你需要不断寻找支撑较小的垂直平面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)