两个点云的稳健配准
Robust registration of two point clouds
我需要找到两个 3D 点云之间的变换和旋转差异。为此,我正在查看点云库,因为它看起来很理想。
在干净的测试数据上,我使用了迭代最近点 (ICP),但得到了奇怪的结果(尽管我可能实施不正确)。
我有 pcl::estimateRigidTransformation
工作,它似乎更好,尽管我认为处理嘈杂数据会更糟。
我的问题是:
两朵云会有噪声,虽然它们应该包含相同的点,但会有一些差异。处理此问题的最佳方法是什么?
我是否应该先在两朵云中找到相应的特征,然后再使用 estimateTransform
?或者我应该看看 RANSAC
函数来删除异常值? ICP
是否比 estimateRigidTransform
更好?
您可以使用超级4pcs进行全球注册。 ICP 是局部方法,例如依赖于初始答案的梯度下降。
如果你的云很嘈杂,而且你的初始对齐不是很好,请忘记从一开始就应用 ICP。尝试获取云上的关键点,然后估计这些关键点的特征。您可以测试不同的 keypoint/feature 算法并选择最适合您的情况的算法。
然后就可以匹配这些特征,得到对应关系。在 RANSAC 循环中过滤这些对应关系以获得您将用于获得初始转换的内点。 CorrespondenceRejectorSampleConsensus
将在这一步中帮助您。
应用此转换后,您可以使用 ICP 进行最终优化。
管道是这样的:
- 检测两个点云中的关键点
- 估计这些关键点的特征
- 匹配特征并获得对应关系
- 删除重复项并应用 RANSAC-ish 循环来获取内点
- 获取初始变换并应用于一个点云
- 一旦两个云最初对齐,应用 ICP 注册进行优化
注意:此管道仅在两个点云的比例相同时才有用。在其他情况下,您需要计算云之间的比例因子。
设置稳健的点云配准算法可能是一项具有挑战性的任务,需要正确设置各种不同的选项、超参数和技术以获得出色的结果。
然而 Point Cloud Library 带有一整套预先实现的功能来解决这种任务。剩下要做的唯一一件事就是了解每个块在做什么,然后设置一个所谓的 ICP 管道,由这些块堆叠在一起。
ICP 管道可以遵循两条不同的路径:
1.迭代注册算法
更简单的方法是立即开始在输入云 (IC) 上应用迭代最近点算法,始终使用最近点方法将其与固定参考云 (RC) 进行数学运算。 ICP 乐观地假设两个点云足够接近(旋转 R 和平移 T 的先验良好)并且配准将在没有进一步初始对齐的情况下收敛。
这条路径当然会陷入局部最小值,因此性能很差,因为它很容易被给定输入数据中的任何类型的不准确所愚弄。
2。基于特征的注册算法
为了克服这个问题,人们致力于开发各种方法和想法来克服性能不佳的注册。与单纯的迭代配准算法相比,基于特征的配准首先尝试在两个点云之间找到更高的杠杆对应关系,以加快过程并提高准确性。这些方法被封装,然后嵌入到注册管道中,形成一个完整的注册模型。
来自 PCL documentation 的下图显示了这样一个注册管道:
如您所见,成对注册应该 运行 通过不同的计算步骤才能达到最佳效果。单个步骤是:
数据采集:将输入云和参考云输入算法。
估计关键点:关键点(interest point)是点云中具有以下特征的点:
- 它有一个清晰的,最好是有数学基础的定义,
- 它在图像中有明确的位置 space,
- 兴趣点周围的局部图像结构,局部信息内容丰富
点云中的这些显着点非常有用,因为它们的总和表征了点云并有助于区分点云的不同部分。
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 >
描述关键点 - 特征描述符:检测到关键点后,我们继续为每个关键点计算一个描述符。 “局部描述符是点局部邻域的紧凑表示。与描述完整对象或点云的全局描述符相比,局部描述符试图仅在点周围的局部邻域中模拟形状和外观,因此非常适合表示它在匹配方面。” (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::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 >
变换估计: 在计算出两个点云之间的稳健对应关系后,使用绝对方向算法计算 6DOF(6 自由度)变换它应用于输入云以匹配参考点云。有许多不同的算法方法可以做到这一点,PCL 然而包括基于 Singular Value Decomposition(SVD) 的实现。计算一个 4x4 矩阵,描述匹配点云所需的旋转和平移。
pcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
进一步阅读:
我需要找到两个 3D 点云之间的变换和旋转差异。为此,我正在查看点云库,因为它看起来很理想。
在干净的测试数据上,我使用了迭代最近点 (ICP),但得到了奇怪的结果(尽管我可能实施不正确)。
我有 pcl::estimateRigidTransformation
工作,它似乎更好,尽管我认为处理嘈杂数据会更糟。
我的问题是:
两朵云会有噪声,虽然它们应该包含相同的点,但会有一些差异。处理此问题的最佳方法是什么?
我是否应该先在两朵云中找到相应的特征,然后再使用 estimateTransform
?或者我应该看看 RANSAC
函数来删除异常值? ICP
是否比 estimateRigidTransform
更好?
您可以使用超级4pcs进行全球注册。 ICP 是局部方法,例如依赖于初始答案的梯度下降。
如果你的云很嘈杂,而且你的初始对齐不是很好,请忘记从一开始就应用 ICP。尝试获取云上的关键点,然后估计这些关键点的特征。您可以测试不同的 keypoint/feature 算法并选择最适合您的情况的算法。
然后就可以匹配这些特征,得到对应关系。在 RANSAC 循环中过滤这些对应关系以获得您将用于获得初始转换的内点。 CorrespondenceRejectorSampleConsensus
将在这一步中帮助您。
应用此转换后,您可以使用 ICP 进行最终优化。
管道是这样的:
- 检测两个点云中的关键点
- 估计这些关键点的特征
- 匹配特征并获得对应关系
- 删除重复项并应用 RANSAC-ish 循环来获取内点
- 获取初始变换并应用于一个点云
- 一旦两个云最初对齐,应用 ICP 注册进行优化
注意:此管道仅在两个点云的比例相同时才有用。在其他情况下,您需要计算云之间的比例因子。
设置稳健的点云配准算法可能是一项具有挑战性的任务,需要正确设置各种不同的选项、超参数和技术以获得出色的结果。
然而 Point Cloud Library 带有一整套预先实现的功能来解决这种任务。剩下要做的唯一一件事就是了解每个块在做什么,然后设置一个所谓的 ICP 管道,由这些块堆叠在一起。
ICP 管道可以遵循两条不同的路径:
1.迭代注册算法
更简单的方法是立即开始在输入云 (IC) 上应用迭代最近点算法,始终使用最近点方法将其与固定参考云 (RC) 进行数学运算。 ICP 乐观地假设两个点云足够接近(旋转 R 和平移 T 的先验良好)并且配准将在没有进一步初始对齐的情况下收敛。
这条路径当然会陷入局部最小值,因此性能很差,因为它很容易被给定输入数据中的任何类型的不准确所愚弄。
2。基于特征的注册算法
为了克服这个问题,人们致力于开发各种方法和想法来克服性能不佳的注册。与单纯的迭代配准算法相比,基于特征的配准首先尝试在两个点云之间找到更高的杠杆对应关系,以加快过程并提高准确性。这些方法被封装,然后嵌入到注册管道中,形成一个完整的注册模型。
来自 PCL documentation 的下图显示了这样一个注册管道:
如您所见,成对注册应该 运行 通过不同的计算步骤才能达到最佳效果。单个步骤是:
数据采集:将输入云和参考云输入算法。
估计关键点:关键点(interest point)是点云中具有以下特征的点:
- 它有一个清晰的,最好是有数学基础的定义,
- 它在图像中有明确的位置 space,
- 兴趣点周围的局部图像结构,局部信息内容丰富
点云中的这些显着点非常有用,因为它们的总和表征了点云并有助于区分点云的不同部分。
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 >
描述关键点 - 特征描述符:检测到关键点后,我们继续为每个关键点计算一个描述符。 “局部描述符是点局部邻域的紧凑表示。与描述完整对象或点云的全局描述符相比,局部描述符试图仅在点周围的局部邻域中模拟形状和外观,因此非常适合表示它在匹配方面。” (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::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 >
变换估计: 在计算出两个点云之间的稳健对应关系后,使用绝对方向算法计算 6DOF(6 自由度)变换它应用于输入云以匹配参考点云。有许多不同的算法方法可以做到这一点,PCL 然而包括基于 Singular Value Decomposition(SVD) 的实现。计算一个 4x4 矩阵,描述匹配点云所需的旋转和平移。
pcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
进一步阅读: