许多问题涉及从深度生成法线或从法线生成深度,但是我想问一个简单的方法,即根据图像的深度和法线生成所有平面。
我已经掌握了图像中每个像素的深度和法线。对于每个像素(ui, vi)
,假定我们可以将(xi, yi, zi)
作为深度和法线向量zi
来获得其3D坐标(nix, niy, niz)
。因此,一个唯一的切平面定义为:nix(x - xi) + niy(y - yi) + niz(z - zi) = 0.
然后,对于每个像素,我们可以通过上述方程式定义一个唯一的平面。
查找f
这样的函数f(u, v) = (x, y, z)
(从像素到3D坐标)的常见做法是什么?针孔模型(加上深度数据)是一种有效且准确的模型吗?
一个人如何有效地生成所有平面?一种方法是遍历图像中的所有像素并找到所有平面,但这似乎是无效的方法。
答案 0 :(得分:0)
如果是针孔模型
确保3D数据不会因投影而失真。
按常规分组您的积分
根据点数/标准精度,这是容易还是困难。只需按法线对点进行排序即可得出O(n.log(n))
,其中n
是点数。
在单个正常组中按平面进行测试/分组
想法是从组计算平面中选择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空间中)会产生更好的结果,并且更简单。确保将向量归一化。另一种选择是仅通过两个参数(例如球面角)来表示矢量,但这将导致非常不均匀的映射,并产生相位包裹问题。