ICP介绍

本文深入探讨了如何利用PCL库实现点云之间的匹配过程,包括关键点识别、特征描述、对应关系估计、匹配流程及最终的变换估计等核心环节。详细解释了双对应算法的工作原理和步骤,提供了在复杂点云数据处理中的实用解决方案。

转:如何用PCL做点云之间的匹配  

2013-08-19 07:16:35|  分类: 默认分类 |  标签: |字号 订阅

http://blog.csdn.net/u010696366/article/details/8941938

PCL Registration API

Registration:不断调整,把不同角度的3D点数据整合到一个完整的模型中。
它的目的在于在一个全局坐标系下找到不同视角的定位与定向(两个视角交叉部分重叠完好为最优)。这就是KinectFusion论文中所提到的ICP( Iterative Closest Point )算法。给定输入数据集,首先做一个估计,然后通过旋转和平移变换一个数据集,找到一个正确的点集对应方式完美匹配。下面几页PPT是ICP很好的解释。


PCL提供了很多算法,多组点集对应估计,剔除坏对应,稳健的变换估计等。下面详细解释。

Pairwise registration

两个点集的对应,输出通常是一个4×4刚性变换矩阵:代表旋转和平移,它应用于源数据集,结果是完全与目标数据集匹配。下图是“双对应”算法中一次迭代的步骤:

对两个数据源a,b匹配运算步骤如下:

  • 从其中一个数据源a出发,分析其最能代表两个数据源场景共同点的关键点k
  • 在每个关键点ki处,算出一个特征描述子fi
  • 从这组特征描述子{fi}和他们在a和b中的XYZ坐标位置,基于fi和xyz的相似度,找出一组对应
  • 由于实际数据源是有噪的,所以不是所有的对应都有效,这就需要一步一步排除对匹配起负作用的对应
  • 从剩下的较好对应中,估计出一个变换
匹配过程中模块
Keypoints(关键点)

关键点是场景中有特殊性质的部分,一本书的边角,书上印的字母P都可以称作关键点。PCL中提供的关键点算法如NARFSIFTFAST。你可以选用所有点或者它的子集作为关键点,但需要考虑的是按毎帧有300k点来算,就有300k^2种对应组合。

Feature descriptors(特征描述子)

根据选取的关键点生成特征描述。把有用信息集合在向量里,进行比较。方法有:NARF, FPFH, BRIEF SIFT.

Correspondences estimation(对应关系估计)

已知从两个不同的扫描图中抽取的特征向量,找出相关特征,进而找出数据中重叠的部分。根据特征的类型,可以选用不同的方法。

点匹配(point matching, 用xyz坐标作为特征),无论数据有无重组,都有如下方法:

  • brute force matching(强制匹配),
  • kd-tree nearest neighbor search (FLANN)kd树最近邻搜索,
  • searching in the image space of organized data(在图像空间搜索有组织的数据)
  • searching in the index space of organized data(按索引搜索有组织的数据).

特征匹配(feature matching, 用特征做为特征),只有下面两种方法:

  • brute force matching (强制匹配)
  • kd-tree nearest neighbor search (FLANN)kd树最近邻搜索.

除了搜索法,还有两种著名对应估计:

  • 直接估计对应关系(默认),对点云A中的每一点,搜索在B中的对应关系
  • “Reciprocal” 相互对应关系估计,只用AB重叠部分,先从AB找对应,再从BA找对应。
Correspondences rejection(剔除错误估计)

剔除错误估计,可用 RANSAC 算法,或减少数量,只用一部分对应关系。有一种特殊的一到多对应,即模型中一个点对应源中的一堆点。这种情况可以用最短路径对应或检查附近的其他匹配过滤掉。

Transformation estimation(最后一步,计算变换)
  • 基于上述匹配评估错误测量值;
  • 评估相机不同pose之间所作的刚性变换(运动估计),使错误测量值最小化;
  • 优化点云结构;
  • E.g, - SVD 运动估计; - Levenberg-Marquardt用不同内核作运动估计;
  • 用刚性变换旋转/平移源数据到目标位置,可能需要对所有点/部分点/关键点内部运行ICP迭代循环;
  • 迭代,直到满足某些收敛标准。
匹配流程总结

ICP(Iterative Closest Point)算法是一种用于点云配准的经典算法,其主要目标是通过迭代优化的方式将两个点云数据集对齐,达到全局一致的场景表示。ICP算法的核心思想是找到两个点集之间的最佳刚体变换,使得一个点集能够尽可能精确地与另一个点集对齐。 ### ICP算法的基本流程 ICP算法的工作流程主要包括以下几个步骤: 1. **选取点集**:从点集 $ P $ 中选取一部分点,作为源点集。 2. **寻找最近邻点**:计算源点集中每个点到目标点集 $ Q $ 的最近邻点,形成对应点对。 3. **计算变换矩阵**:利用这些对应点对,计算出最优的刚体变换矩阵(包括旋转矩阵 $ R $ 和平移向量 $ t $)。 4. **应用变换**:将源点集 $ P $ 应用计算出的变换矩阵,得到新的位置 $ P' $。 5. **评估误差**:计算变换后的点集 $ P' $ 与目标点集 $ Q $ 之间的误差,如距离平方和 $ d $。 6. **迭代优化**:如果误差 $ d $ 小于设定的阈值或达到最大迭代次数,则停止;否则,返回步骤2继续迭代。 ### 刚体变换的求解 在ICP算法中,为了求解最优的刚体变换,通常采用SVD(Singular Value Decomposition)分解的方法。具体步骤如下: 1. **计算质心**:首先计算源点集 $ P $ 和目标点集 $ Q $ 的质心 $ \bar{p} $ 和 $ \bar{q} $。 2. **去质心坐标**:将源点集和目标点集的每个点减去各自的质心,得到去质心后的坐标 $ p_i' = p_i - \bar{p} $ 和 $ q_i' = q_i - \bar{q} $。 3. **计算误差矩阵**:构建误差矩阵 $ H $,其定义为: $$ H = \sum_{i=1}^{n} p_i' (q_i')^T $$ 4. **SVD分解**:对误差矩阵 $ H $ 进行SVD分解,得到: $$ H = U \Sigma V^T $$ 5. **计算旋转矩阵**:旋转矩阵 $ R $ 可以通过以下公式计算: $$ R = V U^T $$ 6. **计算平移向量**:平移向量 $ t $ 可以通过以下公式计算: $$ t = \bar{q} - R \bar{p} $$ ### 实现步骤 在实际应用中,ICP算法可以通过编程实现,例如使用Python中的Open3D库。以下是使用Open3D库实现ICP算法的基本步骤: 1. **加载点云数据**:使用Open3D库加载源点云和目标点云数据。 2. **初始化参数**:设置ICP算法的初始参数,如最大迭代次数、收敛阈值等。 3. **执行ICP算法**:调用Open3D库提供的ICP算法接口,传入源点云、目标点云和初始变换矩阵。 4. **获取变换矩阵**:从ICP算法的结果中获取最终的变换矩阵。 5. **应用变换**:将源点云应用最终的变换矩阵,使其与目标点云对齐。 6. **可视化结果**:使用Open3D库的可视化功能,查看配准后的点云效果。 ### 示例代码 以下是一个使用Open3D库实现ICP算法的示例代码: ```python import open3d as o3d # 加载点云数据 source = o3d.io.read_point_cloud("source.pcd") target = o3d.io.read_point_cloud("target.pcd") # 设置初始变换矩阵 initial_transform = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] # 执行ICP算法 threshold = 0.02 # 距离阈值 max_iterations = 100 # 最大迭代次数 result = o3d.pipelines.registration.registration_icp( source, target, threshold, initial_transform, o3d.pipelines.registration.TransformationEstimationPointToPoint(), o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=max_iterations) ) # 获取变换矩阵 transformation = result.transformation # 应用变换 source.transform(transformation) # 可视化结果 o3d.visualization.draw_geometries([source, target]) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值