所以我正在开展一个项目,在那个项目中我和我的伙伴使用KINECTv2扫描了一个房间并用它制作了一个3D模型。目标是使实时添加不同类型家具的3D模型成为可能。为了达到这个目标,我正在尝试不同的平面拟合算法,以便找到最快的工作方法。有人有什么建议吗?到目前为止,我只研究了PCL中包含的基本RANSAC算法的用法。
答案 0 :(得分:9)
平面拟合的两种常用方法是RANSAC和Hough。这是一个性能比较:
与计算几何和图像处理中的许多问题一样,而不是考虑什么是最快的,"在性能,开发工作和成本方面考虑应用程序的最佳选择。寻找最快的算法可能会让您走上可怕的成本和复杂性的道路,而您可能能够实现一个相对简单的算法的数据处理链,其运行速度足以为用户提供流畅和愉快的体验。
长话短说,我建议从霍夫飞机开始。霍夫变换算法相对容易编写(一旦掌握了基础知识),调整参数就很直观。
https://en.wikipedia.org/wiki/Hough_transform
编写自己的算法的一个原因是,您可以更好地理解需要做出哪些更改(而不是如果)您发现点云数据比噪声更大且性能更差一个人想。
实现良好的速度将取决于许多因素,包括:
<强>预处理强> 您不需要将任意大小的平面安装到任意点云:相反,您需要安装墙壁,可能还需要地板和天花板。对于霍夫算法,这意味着您可以限制测试参数的范围,从而加快处理速度。
不是试图找到完整的原始点云的所有平面拟合,而是找到将点云分解为子云团的方法,以便更有效地运行平面拟合测试。
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帖子。其中一些是:
用于3D原始检测的局部Hough变换, Bertram Drost,Slobodan Ilic,IEEE 3D Vision 2015
这个想法是基于选择两个导向的点对。比较这些点的方向以确定这些点是否共同位于平面上。所有这些点对的贡献在局部投票空间中组合,其中平面在0维投票空间中被参数化(定向点完全确定平面)。该技术可扩展到不同的原语。
RANSAC通常不如霍夫变换,但所提出的方法可以看作是全球投票方案和RANSAC之间的混合体。当RANSAC选择多个随机点,足以拟合目标基元时,所提出的方法只选择一个点,即参考点。
我还another stackexchange post解释了如何为正交平面开发类似的方法。