我需要找到两个3D点云之间的变换和旋转差异。为此,我正在看点云库,因为它似乎很理想。
在干净的测试数据上,我可以使用迭代最近点(ICP),但是得到的结果很奇怪(尽管我可能实现不正确)。
我可以使用pcl::estimateRigidTransformation
,而且看起来更好,尽管我认为处理嘈杂的数据会更糟。
我的问题是:
两层云将很嘈杂,尽管它们应包含相同的点,但仍存在一些差异。处理此问题的最佳方法是什么?
我是否应该在两朵云中找到相应的功能,然后再使用estimateTransform
?还是应该查看RANSAC
函数以消除异常值? ICP
比estimateRigidTransform
更好吗?
最佳答案
设置健壮的点云注册算法可能是一项具有挑战性的任务,需要正确设置各种选项,超参数和技术,以获得强大的结果。
但是Point Cloud Library附带了一整套预实现的函数来解决此类任务。剩下要做的唯一一件事就是了解每个模块的作用,然后建立一个所谓的ICP管道,该ICP管道将这些模块彼此堆叠在一起。
ICP管道可以遵循两种不同的路径:
1.迭代注册算法
始终通过使用最接近点方法,更容易的路径立即开始在输入云(IC)上应用迭代最近点算法,以使用固定引用云(RC)对它进行数学运算。 ICP乐观地假设两点云足够接近(在旋转R和平移T之前先出现),并且配准将收敛而无需进一步的初始对准。
当然,此路径可能会卡在局部最小值中,因此执行起来会很差,因为它很容易被给定输入数据中的任何类型的错误所欺骗。
2.基于特征的注册算法
为了克服这个问题,人们致力于开发各种方法和思想来克服不良的注册。与单纯的迭代配准算法相比,基于特征的配准首先要在两个点云之间找到更高的杠杆对应关系,以加快过程并提高准确性。将这些方法进行封装,然后嵌入配准管路中以形成完整的配准模型。
下图PCL documentation中的图片显示了这样的注册管道:
如您所见,成对注册应该通过不同的计算步骤来运行以达到最佳性能。单个步骤是:
点云中的此类显着点非常有用,因为它们的总和可表征点云,并有助于区分其不同部分。
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 >
详细信息:PCL Keypoint - Documentationpcl::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 >
详细信息:PCL Features - Documentationpcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar >
pcl::registration::CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar >
pcl::registration::CorrespondenceEstimationNormalShooting< PointSource, PointTarget, NormalT, Scalar >
pcl::registration::CorrespondenceRejectorSampleConsensus< PointT >
pcl::registration::CorrespondenceRejectorDistance
pcl::registration::CorrespondenceRejectorFeatures::FeatureContainer< FeatureT >
pcl::registration::CorrespondenceRejectorPoly< SourceT, TargetT >
详细信息:PCL Module registration - Documentationpcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
详细信息:PCL Module registration - Documentation进一步阅读: