【问题标题】:Find all the planar surfaces in an rgbd image using depth and normal data使用深度和法线数据查找 rgbd 图像中的所有平面
【发布时间】:2019-04-24 16:46:31
【问题描述】:

许多问题都涉及从深度生成法线或从法线生成深度,但我想问一个简单的方法来生成给定图像的深度和法线的所有平面。

我已经有了图像中每个像素的深度和法线。对于每个像素(ui, vi),假设我们可以得到它的3D坐标(xi, yi, zi),以zi作为深度和法向量(nix, niy, niz)。因此,一个唯一的切平面定义为:nix(x - xi) + niy(y - yi) + niz(z - zi) = 0. 然后,对于每个像素,我们可以通过上面的公式定义一个唯一的平面。

  1. 查找函数f 使得f(u, v) = (x, y, z)(从像素到3D 坐标)的常见做法是什么?针孔模型(加上深度数据)是否有效且准确?

  2. 如何有效地生成所有平面?一种方法是遍历图像中的所有像素并找到所有平面,但这似乎是一种无效的方法。

【问题讨论】:

    标签: geometry computational-geometry raytracing


    【解决方案1】:
    1. 如果是针孔模型

      确保您的 3D 数据不会因投影而失真。

    2. 按正常分组您的积分

      这取决于点数/正常精度,这很容易或很难。只需按法线对点进行排序即可得到O(n.log(n)),其中n 是点数。

    3. 在单个正常组中按平面进行测试/分组

      这个想法是从一个组计算平面中选择 3 个点并测试该组的哪些点属于它。如果计数太低,您选择了错误的点(不属于同一平面)并且需要选择不同的点。此外,如果选择的点太靠近每个点或在同一条线上,您将无法从中获得正确的平面。

      平面的数学函数是:

      x*nx + y*ny + z*nz + d = 0
      

      其中(nx,ny,nz) 是您的组法线(单位向量),(x,y,z) 是您的点位置。所以你只需从一个已知点计算d(其中一个被选中的(x0,y0,z0))......

      d = -x0*nx -y0*ny -z0*nz
      

      然后只测试哪些点满足这个条件:

      threshod=1e-20; // just accuracy margin
      fabs(x*nx + y*ny + z*nz + d) <= threshod
      

      现在从组中删除匹配点(将它们移动到找到的平面对象中)并再次将此项目符号应用于剩余点,直到它们计数低或找不到有效平面...

      然后测试另一个组,直到没有剩余组...

    我认为 RANSAC 可以加快速度以避免在这种情况下使用蛮力,但我自己从未使用过它,所以谷歌...

    【讨论】:

    • 您能否澄清“如果计数太少,您选择了错误的点(不属于同一平面)”?假设我有n 点属于同一个正常组。然后我选择点(x0, y0, z0),导出平面方程(如你所说的阈值和东西),然后测试哪些点满足该组中所有其他点的方程。这就是你在说的吗?我对pick 3 points 感到困惑。
    • @SparklesLeet 您可以在数据中拥有更多平行平面,如果您选择具有相同法线但不是来自同一平面的点,那么大多数点将不满足此类平面,暗示您选择了错误的组合前3分。同样在对象的边缘,法线正在迅速变化,因此其可能的组法线不对应于任何平面,在这种情况下,组的人口将少于其他组,并且也不会有大多数点的平面......所以在这两种情况下您检测到具有非常少量点的平面,例如
    • @SparklesLeet ad 是的,您选择 3 个点(随机或按几何距离到每个点等)从中推导出平面,并从同一法线组中的其余点测试哪些点满足该平面。 ..
    • 为什么我们需要3分?我认为 1 点(当然还有它的法线向量)足以从中推导出平面。
    • @SparklesLeet oow 是的,完全忘记你已经有法线了......所以现在我看到你的困惑......所以 3 点就足够了,只有当你不知道正常时才需要。跨度>
    【解决方案2】:

    平面的一种可能方法是考虑一组法线向量并对它们执行聚类(例如通过 k-means)。然后每个簇可以对应几个平行的表面。通过评估与原点的距离(标量函数),您可以形成将这些表面分开的子集群。最后,等距离的点可以属于不同的共面块,您可以通过连通分量标记将它们分开。

    同时对法线向量和距离进行聚类(因此在 4D 空间中)可能会产生更好的结果并且更简单。一定要标准化向量。另一种选择是仅用两个参数(例如球角)来表示向量,但这会导致映射非常不均匀,并产生相位缠绕问题。

    【讨论】:

    • 在这种情况下如何形成子集群?假设我现在有一组像素,它们的法线向量彼此非常接近(如您所说,属于几个平行表面)。如何通过评估与原点的距离来形成子集群?
    • @SparklesLeet:您计算所有距离。并将它们聚集在一起。
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2014-07-16
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多