Algorithm 三维平面拟合算法

Algorithm 三维平面拟合算法,algorithm,3d,plane,printer-control-language,Algorithm,3d,Plane,Printer Control Language,所以我在做一个项目,我和我的一个朋友用KINECTv2扫描了一个房间,并用它制作了一个3D模型。目标是使实时添加不同种类家具的3d模型成为可能。为了达到这个目标,我正在尝试不同的平面拟合算法,以找到哪种算法最快。有人有什么建议吗?到目前为止,我只研究了PCL中包含的基本RANSAC算法的用法。两种常用的平面拟合方法是RANSAC和Hough。这里有一个性能比较: 正如计算几何和图像处理中的许多问题,而不是考虑什么是“最快的”,从性能、开发努力和成本方面考虑什么是最佳的应用程序。搜索最快的算法可

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

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

正如计算几何和图像处理中的许多问题,而不是考虑什么是“最快的”,从性能、开发努力和成本方面考虑什么是最佳的应用程序。搜索最快的算法可能会让您陷入成本和复杂度都令人震惊的境地,而您可能会实现一系列相对简单的算法,这些算法的运行速度刚好能够为用户提供流畅愉快的体验

长话短说,我建议从Hough平面拟合开始。Hough变换算法相对容易编写(一旦掌握了基本知识),调整参数也很直观

编写自己的算法的原因之一是,一旦(而不是如果)发现点云数据比人们希望的噪音更大、性能更差,您将能够更好地理解需要进行哪些更改

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

  • 点云预处理。寻找方法将点云分解为可以更快处理的块
  • 参数化。数据预处理后,可以为平面拟合算法定义更窄的搜索范围。例如,仅在垂直角度的几度范围内尝试平面拟合。您还需要选择参数,以在速度和贴合质量之间找到平衡
  • 三维数据的质量。这本身就是一个大话题,你越早仔细研究数据中的问题越好
  • “实时”是什么意思。即使对于涉及用户交互的3D图形应用程序,实现严格基于规格的实时性(以N帧/秒的速度更新)也可能不如呈现平滑简单的界面重要
  • 多线程和并行性
  • 三维显示。另一个大话题
预处理。 您不需要将任意大小的平面适配到任意点云:相反,您需要适配墙,可能还有地板和天花板。对于Hough算法,这意味着您可以限制测试参数的范围,从而加快处理速度

与其尝试为完整的原始点云找到所有平面拟合,不如找到将点云分解为子云簇的方法,这样可以更有效地运行平面拟合测试

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

此外,对于第一次通过测试,您可能希望减少数据采样,并尝试在相对较少的点上进行拟合。这类似于为2D处理创建“图像金字塔”

八叉树是一种很好的、简单的划分空间的方法,用于查询、冲突测试等。八叉树将一个空间分成八个节点或“八分之一”。这可以想象为将一个立方体切割成八个更小的立方体。然后每一个八分之一又被分成八个八分之一,依此类推。如果一个八分之一点(节点)不包含点,则不需要进一步对其进行分割

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

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

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

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

实时与可感知的平滑。 如果您只需要用户实时移动家具,则可以花费更长的时间生成初始平面配合

多线程/并行 要处理数据输入、平面拟合和用户界面,您几乎肯定必须认真考虑多线程。为了测试算法,您在UI线程上工作只是为了开始,但这是有限的

这样的应用程序需要CUDA或OpenCL。对于3D显示,您仍将使用图形卡。虽然您不需要马上跳转到GPU编程,但记住算法是如何并行的是很有帮助的

3D显示。 您是否计划使用Direct3D或OpenGL进行3D显示和交互?实现软件以允许