两个点云的稳健配准

22
我需要找到两个三维点云之间的变换和旋转差异。为此,我正在寻找 Point Cloud Library,因为它看起来很理想。
在干净的测试数据上,我已经使用了迭代最近点(ICP),但是得到了奇怪的结果(尽管我可能实现不正确)。 我已经使用了 pcl::estimateRigidTransformation,并且它似乎更好,尽管我认为将处理嘈杂的数据更糟。
我的问题是: 这两个点云将是嘈杂的,虽然它们应该包含相同的点,但会存在一些差异。如何处理最好? 首先,我应该找到两个点云中的对应特征,然后使用estimateTransform吗?还是应该查看RANSAC函数以去除异常值?ICP比estimateRigidTransform更好吗?

我对PCL还很陌生,如果这不是有用的,请见谅。这里有PCL Registration library,我认为它会对你有所帮助。 - dhanushka
只需先跟随ICP的一些教程。根据应用程序不同,你可以选择使用哪种滤波器,我真的很喜欢快速体素网格滤波器。但ICP并不是最好的方法。首先学习示例,然后从主干构建自己的pcl ICP。示例中的ICP仅是一个工作函数,而你需要真正的执行者(即专门为你的应用程序构建的ICP),因此请建立自己的ICP! - Martijn van Wezel
3个回答

40

搭建一个强大的点云配准算法可能是一项具有挑战性的任务,涉及到多种不同的选项、超参数和技术,需要正确设置才能获得强大的结果。

然而,点云库提供了一整套预实现的函数来解决这种任务。唯一需要做的就是理解每个模块的作用,然后设置一个所谓的ICP Pipeline,由这些模块堆叠在一起组成。

ICP管道可以遵循两条不同的路径:

1. 迭代配准算法

更简单的路径是立即将迭代最近点算法应用于输入点云(IC),通过始终使用最近点方法与固定参考点云(RC)匹配。ICP做出了一个乐观的假设,即两个点云足够接近(旋转R和平移T的良好先验),并且注册将收敛而无需进一步的初始对齐。

当然,这条路径可能会陷入局部最小值,因此表现非常差,容易被给定输入数据中的任何不准确性所欺骗。

2. 基于特征的配准算法

为了克服这个问题,人们一直在努力开发各种方法和思路来解决性能差的注册。与仅迭代式注册算法不同,基于特征的注册首先尝试找到两个点云之间的更高级别的对应关系,以加快过程并提高准确性。这些方法被封装,然后嵌入到注册管道中,形成完整的注册模型。
下图来自PCL documentation,显示了这样一个注册管道:

PCL pairwise registration

正如您所看到的,成对注册应该通过不同的计算步骤来执行最佳效果。这些单个步骤包括:

  1. 数据采集:将输入云和参考云输入算法。

  2. 关键点估计:关键点(兴趣点)是点云中具有以下特征的点:

    1. 它具有清晰、最好是数学上有良好基础的定义;
    2. 它在图像空间中有明确定义的位置;
    3. 兴趣点周围的局部图像结构在本地信息内容方面丰富。

    点云中这些显著点非常有用,因为它们的总和表征了点云,并帮助区分其不同部分。

    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 - Documentation

  3. 描述关键点-特征描述符:在检测到关键点之后,我们继续为每个关键点计算描述符。"局部描述符是一个点的局部邻域的紧凑表示。与描述完整对象或点云的全局描述符不同,局部描述符仅尝试在点周围的局部邻域中类似于形状和外观,并因此非常适合用于匹配来表示它。"(Dirk Holz et al.)

    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 >
    

    详细信息:PCL Features - Documentation

  4. 对应估计:下一步是找到点云中发现的关键点之间的对应关系。通常利用计算出的局部特征描述符,将每个描述符与另一个点云中的相应描述符进行匹配。然而,由于来自类似场景的两个扫描不一定具有相同数量的特征描述符,因为一个云可能比另一个云具有更多的数据,所以我们需要运行一个分离的对应关系拒绝过程。

    pcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar >
    pcl::registration::CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar >
    pcl::registration::CorrespondenceEstimationNormalShooting< PointSource, PointTarget, NormalT, Scalar >
    
  5. 对应关系拒绝:执行对应关系拒绝的最常见方法之一是使用RANSAC(随机抽样一致性)。但是PCL提供了更多的拒绝算法,值得仔细研究:

    p
    
    

    进一步阅读:


谢谢,这是一个很棒的答案! - freakinpenguin
截至2020年11月,PCL文档的所有链接均无法使用。您能否修复它们并提供相关/当前的链接? - Mason
@Mason 谢谢你提醒我。我已经修复了所有链接。 - Kevin Katzke

7
如果您的云数据嘈杂且初始对齐不够好,请忘记从一开始就应用ICP。尝试在云数据中获取关键点,然后估算这些关键点的特征。您可以测试不同的关键点/特征算法,并选择适合您情况的表现更好的算法。
然后,您可以匹配这些特征并获得对应关系。通过一个RANSAC循环过滤这些对应关系以获得内点,您将使用这些内点来获取初始变换。在这个步骤中,CorrespondenceRejectorSampleConsensus会对您有所帮助。
一旦应用了这种转换,您就可以使用ICP进行最终的精细调整。
管道如下:
1. 在两个点云中检测关键点 2. 估算这些关键点的特征 3. 匹配特征并获得对应关系 4. 删除重复项并应用类似于RANSAC的循环以获得内点 5. 获得初始变换并应用于一个点云 6. 一旦两个点云初始对齐,应用ICP注册以进行精细调整
注意:此流程仅适用于两个点云处于相同的比例上。否则,您需要计算两个点云之间的比例因子。

你说的“同一尺度”是什么意思?你是指点云必须具有相同的大小吗? - Aram Gevorgyan
1
@AramGevorgyan 有时候同一场景的两个点云可能具有不同的比例尺。如果您使用RGB-D相机获取它们,它们将大多具有相同的绝对比例尺(米、英尺...)。然而,在某些情况下,您可以检索到具有不同或任意比例尺的点云(例如结构从动),首先您需要将所有云转换为相同的比例尺以应用上述流程。 - Finfa811

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接