PCL 注册 API
将各种 3D 点云数据视图一致地对齐到完整模型的过程称为注册。其目标是找到在全局坐标框架中单独获取的视图的相对位置和方向,以便它们之间的交叉区域完美重叠。因此,对于从不同视图获取的每个点云数据集,我们需要一个能够将它们对齐到单个点云模型的系统,以便可以应用后续处理步骤,如分割和对象重建。
代码首先包含了一系列pcl库的头文件,用于工作流中的各种点云处理步骤:输入输出、常用计算、点类型定义、特征计算、配准等。使用了pcl命名空间下的多个模块。定义了几种类型别名,例如PointNormal
被定义为PointT
。
在findCorrespondences
函数中,代码创建了一个CorrespondenceEstimationBackProjection
的对象,用来估计两个点云之间的对应关系。该函数依赖于点云的表面法线信息,使用带法线的点云来估计源点云src和目标点云tgt之间的对应关系。
rejectBadCorrespondences
函数负责拒绝/过滤掉坏的对应关系,它首先使用CorrespondenceRejectorMedianDistance
根据中位数因子来拒绝离群值,然后根据点法线被CorrespondenceRejectorSurfaceNormal
作为标准进一步拒绝不满足阈值的对应关系。
findTransformation
函数利用点到平面的最小二乘法估计(TransformationEstimationPointToPlaneLLS
)来找到最佳变换,帮助将src点云对齐到tgt点云。
view
函数是用于可视化结果的辅助函数。如果设置了可视化标志,它会显示源点云、目标点云以及它们之间的对应关系。
在icp
函数中,执行了迭代最近点(ICP)算法,基于以上定义的函数完成对两个点云的配准。这个过程会循环查找对应关系,拒绝坏的对应关系,估计变换,并不断更新源点云的位置直到收敛。最终,将变换矩阵返回。
saveTransform
函数负责将最终的变换矩阵写入一个外部文件中,以便于其他应用或者分析使用。
main
函数是程序的入口点,解析命令行参数来获取输入输出文件,设置调试和可视化选项,加载点云文件,调用ICP算法配准点云,保存变换矩阵,并在标准输出中打印变换矩阵以供查看。
该程序的总体目标是,加载两个PCD文件,利用ICP算法寻找一个变换矩阵,从而可以最好地使两个点云对齐。在这一过程中,它还提供了错误拒绝策略,以提高配准的准确性,并且可选地支持结果的可视化。最后,将最佳变换矩阵保存到文件,并打印到控制台。
#include <fstream> // 包含C++文件操作库
#include <pcl/common/angles.h> // 包含PCL库中的角度转换相关功能
#include <pcl/console/parse.h> // 包含PCL命令行解析功能
#include <pcl/point_types.h> // 包含PCL点类型定义
#include <pcl/point_cloud.h> // 包含PCL点云数据结构
#include <pcl/point_representation.h> // 包含PCL点表示方法
#include <pcl/io/pcd_io.h> // 包含PCL的PCD文件输入输出操作
#include <pcl/console/time.h> // 包含PCL计时功能
#include <pcl/features/normal_3d.h> // 包含PCL表面法线估计相关功能
#include <pcl/features/fpfh.h> // 包含PCL的FPFH特征描述子计算功能
#include <pcl/registration/correspondence_estimation.h> // 包含PCL点云配准中的对应点估计功能
#include <pcl/registration/correspondence_estimation_normal_shooting.h> // 包含PCL取法线方向作为对应点搜索方向的对应点估计方法
#include <pcl/registration/correspondence_estimation_backprojection.h> // 包含PCL基于反投影的对应点估计方法
#include <pcl/registration/correspondence_rejection_median_distance.h> // 包含PCL基于中值距离的对应点剔除方法
#include <pcl/registration/correspondence_rejection_surface_normal.h> // 包含PCL基于表面法线一致性的对应点剔除方法
#include <pcl/registration/transformation_estimation_point_to_plane_lls.h> // 包含PCL的点到平面最小二乘法变换估计方法
#include <pcl/registration/default_convergence_criteria.h> // 包含PCL的默认收敛判断条件定义
#include <pcl/visualization/pcl_visualizer.h> // 包含PCL的点云可视化工具
using namespace pcl; // 使用PCL命名空间
using namespace pcl::io; // 使用PCL输入输出命名空间
using namespace pcl::console; // 使用PCL控制台命名空间
using namesp