gpt4 book ai didi

c++ - 两点云的稳健配准

转载 作者:IT老高 更新时间:2023-10-28 22:35:42 24 4
gpt4 key购买 nike

我需要找到两个3D点云之间的变换和旋转差异。为此,我正在看点云库,因为它似乎很理想。
在干净的测试数据上,我可以使用迭代最近点(ICP),但是得到的结果很奇怪(尽管我可能实现不正确)。
我可以使用pcl::estimateRigidTransformation,而且看起来更好,尽管我认为处理嘈杂的数据会更糟。
我的问题是:
两层云将很嘈杂,尽管它们应包含相同的点,但仍存在一些差异。处理此问题的最佳方法是什么?
我是否应该在两朵云中找到相应的功能,然后再使用estimateTransform?还是应该查看RANSAC函数以消除异常值? ICPestimateRigidTransform更好吗?

最佳答案

设置健壮的点云注册算法可能是一项具有挑战性的任务,需要正确设置各种选项,超参数和技术,以获得强大的结果。
但是Point Cloud Library附带了一整套预实现的函数来解决此类任务。剩下要做的唯一一件事就是了解每个模块的作用,然后建立一个所谓的ICP管道,该ICP管道将这些模块彼此堆叠在一起。
ICP管道可以遵循两种不同的路径:
1.迭代注册算法
始终通过使用最接近点方法,更容易的路径立即开始在输入云(IC)上应用迭代最近点算法,以使用固定引用云(RC)对它进行数学运算。 ICP乐观地假设两点云足够接近(在旋转R和平移T之前先出现),并且配准将收敛而无需进一步的初始对准。
当然,此路径可能会卡在局部最小值中,因此执行起来会很差,因为它很容易被给定输入数据中的任何类型的错误所欺骗。
2.基于特征的注册算法
为了克服这个问题,人们致力于开发各种方法和思想来克服不良的注册。与单纯的迭代配准算法相比,基于特征的配准首先要在两个点云之间找到更高的杠杆对应关系,以加快过程并提高准确性。将这些方法进行封装,然后嵌入配准管路中以形成完整的配准模型。
下图PCL documentation中的图片显示了这样的注册管道:
PCL pairwise registration
如您所见,成对注册应该通过不同的计算步骤来运行以达到最佳性能。单个步骤是:

  • 数据采集:将输入云和引用云输入到算法中。
  • 估计关键点:关键点(interest point)是点云中具有以下特征的点:
  • ,它有一个清晰的,最好是数学上有据的定义
  • 在图像空间
  • 中有明确定义的位置
  • 兴趣点周围的本地镜像结构在本地信息内容方面很丰富

  • 点云中的此类显着点非常有用,因为它们的总和可表征点云,并有助于区分其不同部分。
    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
  • 描述关键点-功能描述符:在检测到关键点后,我们继续为每个关键点计算一个描述符。 “局部描述符是点的局部邻域的紧凑表示。与描述完整对象或点云的全局描述符相反,局部描述符试图仅在点周围的局部邻域中模仿形状和外观,因此非常适合表示它在匹配方面。” (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
  • 对应估计:下一个任务是找到在点云中找到的关键点之间的对应关系。通常,一个人利用计算出的局部特征描述符,并将它们中的每一个与另一点云中的对应特征进行匹配。但是,由于来自相似场景的两次扫描不一定具有相同数量的特征描述符,因为一个云可能比另一个云具有更多数据,因此我们需要运行单独的对应拒绝过程。
    pcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar >
    pcl::registration::CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar >
    pcl::registration::CorrespondenceEstimationNormalShooting< PointSource, PointTarget, NormalT, Scalar >
  • 对应拒绝:执行对应拒绝的最常见方法之一是使用RANSAC(随机样本共识)。但是PCL附带了更多的拒绝算法,值得一看。
    pcl::registration::CorrespondenceRejectorSampleConsensus< PointT >
    pcl::registration::CorrespondenceRejectorDistance
    pcl::registration::CorrespondenceRejectorFeatures::FeatureContainer< FeatureT >
    pcl::registration::CorrespondenceRejectorPoly< SourceT, TargetT >
    详细信息:PCL Module registration - Documentation
  • 变换估计:在计算了两个点云之间的鲁棒对应关系之后,使用绝对方向算法来计算6DOF(6自由度)变换,该变换将应用于输入云以匹配引用点云。这样做有很多不同的算法方法,但是PCL包括基于Singular Value Decomposition(SVD)的实现。计算出一个4x4的矩阵,该矩阵描述了匹配点云所需的旋转和平移。
    pcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
    详细信息:PCL Module registration - Documentation

  • 进一步阅读:
  • PCL Point Cloud Registration
  • Registration with the Point Cloud Library
  • PCL - How features work
  • 关于c++ - 两点云的稳健配准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559556/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com