使用深度和法线数据查找 rgbd 图像中的所有平面
Find all the planar surfaces in an rgbd image using depth and normal data
很多问题涉及从深度生成法线或从法线生成深度,但我想问一下在给定图像的深度和法线的情况下生成所有平面的简单方法。
我已经有了图像中每个像素的深度和法线。对于每个像素 (ui, vi)
,假设我们可以得到它的 3D 坐标 (xi, yi, zi)
,其中 zi
作为深度和法向量 (nix, niy, niz)
。因此,唯一的切平面定义为: nix(x - xi) + niy(y - yi) + niz(z - zi) = 0.
然后,对于每个像素,我们可以通过上述等式定义一个唯一的平面。
找到函数 f
使得 f(u, v) = (x, y, z)
(从像素到 3D 坐标)的常见做法是什么?针孔模型(加上深度数据)是否有效且准确?
如何有效地生成所有平面?一种方法是遍历图像中的所有像素并找到所有平面,但这似乎是一种无效的方法。
如果是针孔型号
确保您的 3D 数据没有因投影而变形。
按正常方式对您的分数进行分组
这取决于 points/normal 的准确性。只需按法线对点进行排序即可得到 O(n.log(n))
,其中 n
是点数。
test/group坐飞机单人正常组
思路是从一个组计算平面中挑出3个点,测试组中哪些点属于它。如果计数太低,您会选择错误的点(不属于同一平面)并且需要选择不同的点。此外,如果选取的点太靠近每个点或在同一条线上,您将无法从中获得正确的平面。
飞机的数学函数是:
x*nx + y*ny + z*nz + d = 0
其中 (nx,ny,nz)
是组的法线(单位向量),(x,y,z)
是您的点位置。因此,您只需从已知点(选择的点之一 (x0,y0,z0)
)计算 d
...
d = -x0*nx -y0*ny -z0*nz
然后测试哪些点满足这个条件:
threshod=1e-20; // just accuracy margin
fabs(x*nx + y*ny + z*nz + d) <= threshod
现在从组中删除匹配点(将它们移动到找到的平面对象中)并再次将此项目符号应用于剩余的点,直到它们计数低或找不到有效平面...
然后测试另一组,直到没有组为止...
我认为 RANSAC 在这种情况下可以加快速度以避免暴力破解,但我自己从未使用过它,所以 google ...
平面的一种可能方法是考虑法向量集并对它们执行聚类(例如通过 k 均值)。那么每个簇可以对应几个平行面。通过评估与原点的距离(标量函数),您可以形成将这些表面分开的子簇。最后,距离恒定的点可以属于不同的共面贴片,您可以通过连通分量标记将它们分开。
同时对法向量和距离进行聚类(因此在 4D space 中)可能会产生更好的结果并且更简单。确保对向量进行归一化。另一种选择是仅用两个参数(例如球面角)表示矢量,但这会导致映射非常不均匀,并产生相位缠绕问题。
很多问题涉及从深度生成法线或从法线生成深度,但我想问一下在给定图像的深度和法线的情况下生成所有平面的简单方法。
我已经有了图像中每个像素的深度和法线。对于每个像素 (ui, vi)
,假设我们可以得到它的 3D 坐标 (xi, yi, zi)
,其中 zi
作为深度和法向量 (nix, niy, niz)
。因此,唯一的切平面定义为: nix(x - xi) + niy(y - yi) + niz(z - zi) = 0.
然后,对于每个像素,我们可以通过上述等式定义一个唯一的平面。
找到函数
f
使得f(u, v) = (x, y, z)
(从像素到 3D 坐标)的常见做法是什么?针孔模型(加上深度数据)是否有效且准确?如何有效地生成所有平面?一种方法是遍历图像中的所有像素并找到所有平面,但这似乎是一种无效的方法。
如果是针孔型号
确保您的 3D 数据没有因投影而变形。
按正常方式对您的分数进行分组
这取决于 points/normal 的准确性。只需按法线对点进行排序即可得到
O(n.log(n))
,其中n
是点数。test/group坐飞机单人正常组
思路是从一个组计算平面中挑出3个点,测试组中哪些点属于它。如果计数太低,您会选择错误的点(不属于同一平面)并且需要选择不同的点。此外,如果选取的点太靠近每个点或在同一条线上,您将无法从中获得正确的平面。
飞机的数学函数是:
x*nx + y*ny + z*nz + d = 0
其中
(nx,ny,nz)
是组的法线(单位向量),(x,y,z)
是您的点位置。因此,您只需从已知点(选择的点之一(x0,y0,z0)
)计算d
...d = -x0*nx -y0*ny -z0*nz
然后测试哪些点满足这个条件:
threshod=1e-20; // just accuracy margin fabs(x*nx + y*ny + z*nz + d) <= threshod
现在从组中删除匹配点(将它们移动到找到的平面对象中)并再次将此项目符号应用于剩余的点,直到它们计数低或找不到有效平面...
然后测试另一组,直到没有组为止...
我认为 RANSAC 在这种情况下可以加快速度以避免暴力破解,但我自己从未使用过它,所以 google ...
平面的一种可能方法是考虑法向量集并对它们执行聚类(例如通过 k 均值)。那么每个簇可以对应几个平行面。通过评估与原点的距离(标量函数),您可以形成将这些表面分开的子簇。最后,距离恒定的点可以属于不同的共面贴片,您可以通过连通分量标记将它们分开。
同时对法向量和距离进行聚类(因此在 4D space 中)可能会产生更好的结果并且更简单。确保对向量进行归一化。另一种选择是仅用两个参数(例如球面角)表示矢量,但这会导致映射非常不均匀,并产生相位缠绕问题。