ant*_*nti 16 c++ point-clouds point-cloud-library
我需要找到两个三维点云之间的变换和旋转差异.为此,我正在寻找PCL,因为它看起来很理想.
关于干净的测试数据我有迭代最近点工作,但给出了奇怪的结果(虽然我可能已经错误地实现了...)我有pcl::estimateRigidTransformation工作,看起来更好,虽然我认为会更糟糕的数据噪音.
我的问题是:
这两个云会很吵,虽然它们应该包含相同的点,但会有一些差异.处理这个问题的最佳方法是什么?
我应该在两个云中找到相应的功能开始然后使用estimateTransform吗?或者我应该看一个RANSAC删除异常值的函数?是ICP一个更好的方式去estimateRigidTransform?
Kev*_*zke 25
建立健壮的点云注册算法可能是一项具有挑战性的任务,需要不同的选项,超参数和正确设置的技术以获得强大的结果.
然而,Point Cloud Library附带了一整套预先实现的功能来解决这类任务.剩下要做的唯一事情就是了解每个块正在做什么,然后设置一个所谓的ICP管道,这些管道由相互堆叠的这些块组成.
ICP管道可以遵循两种不同的路径:
1.迭代配准算法
更简单的路径立即开始在输入云(IC)上应用迭代最近点算法,通过始终使用最接近的点方法,使用固定的参考云(RC)对其进行数学计算.ICP乐观地认为两点云足够接近(在旋转R和平移T之前良好)并且配准将在没有进一步初始对准的情况下收敛.
当然,这条路径可能会陷入局部最小值,因此性能非常差,因为它容易被给定输入数据中的任何不准确性所欺骗.
2.基于特征的配准算法
为了克服这个问题,人们一直致力于开发各种方法和想法来克服糟糕的表现.与仅仅迭代的配准算法相比,基于特征的配准首先轮胎以找到两个点云之间的更高的杠杆对应性以加速该过程并提高准确性.将这些方法封装起来,然后嵌入到注册管线中以形成完整的注册模型.
PCL文档中的以下图片显示了这样一个注册管道:
正如您所看到的,成对注册应该通过不同的计算步骤来执行以获得最佳效果.单个步骤是:
数据采集:输入云和参考云被输入算法.
估计关键点:关键点(兴趣点)是点云中具有以下特征的点:
点云中的这些突出点是如此有用,因为它们的总和表征了点云并且有助于使其不同部分可区分.
pcl::NarfKeypoint
pcl::ISSKeypoint3D< PointInT, PointOutT, NormalT >
pcl::HarrisKeypoint3D< PointInT, PointOutT, NormalT >
pcl::HarrisKeypoint6D< PointInT, PointOutT, NormalT >
pcl::SIFTKeypoint< PointInT, PointOutT >
pcl::SUSANKeypoint< PointInT, PointOutT, NormalT, IntensityT >
Run Code Online (Sandbox Code Playgroud)
详细信息:PCL关键点 - 文档
描述关键点 - 特征描述符:在检测到关键点之后,我们继续为每个关键点计算描述符."局部描述符是点的局部邻域的紧凑表示.与描述完整对象或点云的全局描述符相反,局部描述符仅尝试在点周围的局部邻域中类似于形状和外观,因此非常适合于表示它.在匹配方面." (Dirk Holz等人)
pcl::FPFHEstimation< PointInT, PointNT, PointOutT >
pcl::NormalEstimation< PointInT, PointOutT >
pcl::NormalEstimationOMP< PointInT, PointOutT >
pcl::OURCVFHEstimation< PointInT, PointNT, PointOutT >
pcl::PrincipalCurvaturesEstimation< PointInT, PointNT, PointOutT >
pcl::IntensitySpinEstimation< PointInT, PointOutT >
Run Code Online (Sandbox Code Playgroud)
详细信息:PCL功能 - 文档
对应估计:下一个任务是找到点云中找到的关键点之间的对应关系.通常,人们利用计算出的局部特征描述符,并将它们中的每一个与其他点云中的对应对应物相匹配.然而,由于来自类似场景的两次扫描不一定具有相同数量的特征描述符,因为一个云可以具有比另一个更多的数据,所以我们需要运行分离的对应拒绝过程.
pcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar >
pcl::registration::CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar >
pcl::registration::CorrespondenceEstimationNormalShooting< PointSource, PointTarget, NormalT, Scalar >
Run Code Online (Sandbox Code Playgroud)通信拒绝:执行通信拒绝的最常用方法之一是使用RANSAC(随机样本共识).但是PCL带有更多的拒绝算法,值得让它们仔细看看:
pcl::registration::CorrespondenceRejectorSampleConsensus< PointT >
pcl::registration::CorrespondenceRejectorDistance
pcl::registration::CorrespondenceRejectorFeatures::FeatureContainer< FeatureT >
pcl::registration::CorrespondenceRejectorPoly< SourceT, TargetT >
Run Code Online (Sandbox Code Playgroud)
详细信息:PCL模块注册 - 文档
变换估计:在计算两个点云之间的鲁棒对应之后,使用绝对定向算法来计算应用在输入云上以匹配参考点云的6DOF(6自由度)变换.有许多不同的算法方法可以这样做,但PCL包括基于奇异值分解(SVD)的实现.计算4x4矩阵,描述匹配点云所需的旋转和平移.
pcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
Run Code Online (Sandbox Code Playgroud)
详细信息:PCL模块注册 - 文档
进一步阅读:
如果您的云层很嘈杂,并且初始对齐效果不是很好,请不要从一开始就应用ICP。尝试获取云上的关键点,然后估算这些关键点的功能。您可以测试不同的关键点/功能算法,然后选择一种性能更好的案例。
然后,您可以匹配这些功能并获得对应关系。在RANSAC循环中过滤这些对应关系,以获取将用于获得初始转换的inlier。CorrespondenceRejectorSampleConsensus在这一步将为您提供帮助。
应用此转换后,即可使用ICP进行最终优化。
管道类似于:
注意:仅当两个点云的比例相同时,此管道才有用。在其他情况下,您需要计算云之间的比例因子。