3D平面拟合算法

时间:2016-03-01 14:55:52

标签: algorithm 3d plane printer-control-language

所以我正在开展一个项目,在那个项目中我和我的伙伴使用KINECTv2扫描了一个房间并用它制作了一个3D模型。目标是使实时添加不同类型家具的3D模型成为可能。为了达到这个目标,我正在尝试不同的平面拟合算法,以便找到最快的工作方法。有人有什么建议吗?到目前为止,我只研究了PCL中包含的基本RANSAC算法的用法。

2 个答案:

答案 0 :(得分:9)

平面拟合的两种常用方法是RANSAC和Hough。这是一个性能比较:

https://www.researchgate.net/publication/259519997_Continuous_plane_detection_in_point-cloud_data_based_on_3D_Hough_Transform

与计算几何和图像处理中的许多问题一样,而不是考虑什么是最快的,"在性能,开发工作和成本方面考虑应用程序的最佳选择。寻找最快的算法可能会让您走上可怕的成本和复杂性的道路,而您可能能够实现一个相对简单的算法的数据处理链,其运行速度足以为用户提供流畅和愉快的体验。

长话短说,我建议从霍夫飞机开始。霍夫变换算法相对容易编写(一旦掌握了基础知识),调整参数就很直观。

https://en.wikipedia.org/wiki/Hough_transform

编写自己的算法的一个原因是,您可以更好地理解需要做出哪些更改(而不是如果)您发现点云数据比噪声更大且性能更差一个人想。

实现良好的速度将取决于许多因素,包括:

  • 点云预处理。寻找将点云分解成可以更快处理的块的方法。
  • 参数。一旦数据被预处理,您就可以为平面拟合算法定义更窄的搜索范围。例如,只尝试平面几度垂直。您还需要选择参数以在速度和贴合质量之间找到平衡点。
  • 3D数据的质量。这本身就是一个很大的话题,你越早仔细看看数据中的问题就越好。
  • 什么"实时"手段。即使对于涉及用户交互的3D图形应用程序,严格按照规格(N帧/秒的更新)实现实时可能不如呈现流畅简单的界面重要。
  • 多线程和并行性。
  • 3D显示。另一个大话题。

<强>预处理 您不需要将任意大小的平面安装到任意点云:相反,您需要安装墙壁,可能还需要地板和天花板。对于霍夫算法,这意味着您可以限制测试参数的范围,从而加快处理速度。

不是试图找到完整的原始点云的所有平面拟合,而是找到将点云分解为子云团的方法,以便更有效地运行平面拟合测试。

PCL可以为您计算表面法线。如果你可以识别指向大致相同方向的曲面法线簇,然后尝试平面拟合各个簇,你应该能够大大加快速度。

此外,对于您的第一次传递,您可能希望对数据进行缩减采样,并尝试适应相对较少的点数。这类似于创建一个&#34;图像金字塔&#34;用于2D处理。

八分之一是很好的,简单的方法来划分查询空间,碰撞测试等等。八叉树将一个空间划分为八个节点或“八分圆”。&#34;这可以想象为将立方体切割成八个较小的立方体。然后每个八分圆进一步分为八个八分圆,依此类推。如果八分圆(一个节点)不包含点,则不需要进一步划分它。

https://en.wikipedia.org/wiki/Octree

<强>参数。 上面的描述应该清楚地表明,如果您可以通过简化和/或分解原始原始点云来预处理数据,那么您将能够测试更加狭窄定义的搜索,这些搜索将更快地运行。

就此而言,您可能不需要高精度的平面拟合。您可以生成相当好的配合,然后调整这些配合,以生成彼此成直角的天花板,墙壁和地板。

3D数据质量。 Kinect v2是一种飞行时间设备,具有一些固有的测量精度问题。例如,如果您拍摄平面墙的单个图像然后检查深度值,您会注意到图像角落中存在一些非平面的愚蠢。如果您查看多个图像上每个(x,y)像素的深度值的范围(或标准偏差),那么您还会注意到中心像素和边缘像素之间的噪音差异。

执行平面拟合后,生成拟合质量的度量。这需要返回数据来计算用于计算的点的点到平面距离。 (为了提高速度,只使用每个N点或随机采样点。)当您修改参数时,您将看到速度和适合质量方面的效果。

实时与可见光滑。 如果您只需要用户实时移动家具,那么花费更长时间生成初始平面配合应该是可以的。

<强>多线程/平行度 为了处理数据输入,平面拟合和用户界面,您几乎肯定必须仔细考虑多线程。要测试算法,你只需要开始使用UI线程,但这是有限的。

这样的应用程序需要CUDA或OpenCL。对于3D显示器,您无论如何都要使用显卡。虽然您不需要立即跳转到GPU编程,但要记住算法是如何并行化的。

3D显示。 您是否计划使用Direct3D或OpenGL进行3D显示和交互?实施软件,允许用户实时添加不同类型家具的三维模型&#34;建议你不得不依赖显卡。

如果您可以在3D视图中显示点云,也许您甚至不需要平面拟合。您甚至可能会逃脱碰撞检测:如果椅子的3D模型撞到一组点(即墙壁),那么您可能只是检测到碰撞而不是尝试适合平面来定义边界。八分音和其他空间分割技术将有助于加速碰撞测试。

公司Matterport(http://matterport.com/)开发的东西非常类似于您所描述的内容。如果没有别的,你可以试试他们的软件,并考虑可以改进/适应你的需要。

答案 1 :(得分:2)

我很欣赏Rethunk的详细评论,并提供了Local Hough Transform的变体。但首先,让我指出在平面检测或检测相交平面上有一堆stackoverflow / stackexchange帖子。其中一些是:

我在publication at 3DV 2015

中详细解释了我建议的方法
  

用于3D原始检测的局部Hough变换,    Bertram Drost,Slobodan Ilic,IEEE 3D Vision 2015

这个想法是基于选择两个导向的点对。比较这些点的方向以确定这些点是否共同位于平面上。所有这些点对的贡献在局部投票空间中组合,其中平面在0维投票空间中被参数化(定向点完全确定平面)。该技术可扩展到不同的原语。

RANSAC通常不如霍夫变换,但所提出的方法可以看作是全球投票方案和RANSAC之间的混合体。当RANSAC选择多个随机点,足以拟合目标基元时,所提出的方法只选择一个点,即参考点。

我还another stackexchange post解释了如何为正交平面开发类似的方法。