使用深度和法线数据找到rgbd图像中的所有平面

时间:2019-04-24 04:59:53

标签: geometry computational-geometry raytracing

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  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 可以加快处理速度,以免在这种情况下出现暴力行为,但我自己从未使用过,所以google ...

答案 1 :(得分:0)

一种可能的平面处理方法是考虑法向矢量集并对它们进行聚类(例如,通过k均值)。然后,每个簇可以对应于几个平行表面。通过评估与原点的距离(一个标量函数),可以形成将这些表面分开的子簇。最后,等距的点可以属于不同的共面面片,可以通过连接的组件标签将其分开。

可能同时在法向矢量和距离上聚类(因此在4D空间中)会产生更好的结果,并且更简单。确保将向量归一化。另一种选择是仅通过两个参数(例如球面角)来表示矢量,但这将导致非常不均匀的映射,并产生相位包裹问题。