3D点云配准(二多幅点云配准)
原文首发于公众号「3D视觉工坊」:3D点云配准(二多幅点云配准)
在上一篇文章 点云配准(一 两两配准)中我们介绍了两两点云之间的配准原理。本篇文章,我们主要介绍一下PCL中对于多幅点云连续配准的实现过程,重点请关注代码行的注释。
对于多幅点云的配准,它的主要思想是对所有点云进行变换,使得都与第一个点云在统一坐标系中。在每个连贯的、有重叠的点云之间找到最佳的变换,并累积这些变换到全部的点云。能够进行ICP算法的点云需要进行粗略的预匹配,并且一个点云与另一个点云需要有重叠部分。
此处我们以郭浩主编的《点云库PCL从入门到精通》提供的示例demo来介绍一下多幅点云进行配准的过程。
/* ---[ */ int main (int argc, char** argv) { // 加载数据 std::vector
对于上述过程中的核心函数pairAlign(),我们重点介绍如下:
/**匹配一对点云数据集并且返还结果 *参数 cloud_src 是源点云 *参数 cloud_src 是目标点云 *参数output输出的配准结果的源点云 *参数final_transform是在来源和目标之间的转换 */ void pairAlign (const PointCloud::Ptr cloud_src, const PointCloud::Ptr cloud_tgt, PointCloud::Ptr output, Eigen::Matrix4f &final_transform, bool downsample = false) { //下采样 //为了一致性和高速的下采样 //注意:为了大数据集需要允许这项 PointCloud::Ptr src (new PointCloud); //存储滤波后的源点云 PointCloud::Ptr tgt (new PointCloud); //存储滤波后的目标点云 pcl::VoxelGrid grid; //滤波处理对象 if (downsample) { grid.setLeafSize (0.05, 0.05, 0.05); //设置滤波处理时采用的体素大小 grid.setInputCloud (cloud_src); grid.filter (*src); grid.setInputCloud (cloud_tgt); grid.filter (*tgt); } else { src = cloud_src; tgt = cloud_tgt; } //计算曲面法线和曲率 PointCloudWithNormals::Ptr points_with_normals_src (new PointCloudWithNormals); PointCloudWithNormals::Ptr points_with_normals_tgt (new PointCloudWithNormals); pcl::NormalEstimation
思考:
对于小型或者中型数量的点云数据(点个数<100,000),我们选择ICP来进行迭代配准,可是利用对应点的特征计算和匹配较为耗时,如果对于两个大型点云(都超过100000)之间的刚体变换的确定,有什么好办法可以解决呢?
主要参考:郭浩主编的<点云库PCL从入门到精通>
上述内容,如有侵犯版权,请联系作者,会自行删文。
星球成员,可免费提问,并邀进讨论群