首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用深度和法线数据查找rgbd图像中的所有平面表面

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

Stack Overflow用户
提问于 2019-04-24 04:59:52
回答 2查看 478关注 0票数 1

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

我已经有深度和正常的每个像素在图像中。对于每个像素的(ui, vi),假设我们可以得到它的三维坐标(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. 如何有效地生成所有的平面曲面?一种方法是遍历图像中的所有像素并找到所有的平面,但这似乎是一种无效的方法。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-24 07:37:43

  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 然后只需测试哪些点使这个条件饱和: (x*nx+ y*ny + z*nz + d) <=阈值 现在从组中移除匹配的点(将它们移动到已找到的平面对象中),并再次在其余的点上应用此子弹,直到它们计数较低或找不到有效的平面。 然后测试另一组直到没有剩下的组..。

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

票数 0
EN

Stack Overflow用户

发布于 2019-04-24 08:40:45

对于平面来说,一种可能的方法是考虑一组法向量并对它们进行聚类(例如,通过k-均值)。然后,每个簇可以对应于几个平行曲面。通过计算离原点的距离(一个标量函数),你可以形成子簇,将这些表面分开。最后,在恒定距离上的点可以属于不同的共面贴片,您可以通过连通的组件标记来将它们分开。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55822712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档