3D点云配准(二多幅点云配准)

原文首发于公众号「3D视觉工坊」:3D点云配准(二多幅点云配准)

在上一篇文章 点云配准(一 两两配准)中我们介绍了两两点云之间的配准原理。本篇文章,我们主要介绍一下PCL中对于多幅点云连续配准的实现过程,重点请关注代码行的注释。

对于多幅点云的配准,它的主要思想是对所有点云进行变换,使得都与第一个点云在统一坐标系中。在每个连贯的、有重叠的点云之间找到最佳的变换,并累积这些变换到全部的点云。能够进行ICP算法的点云需要进行粗略的预匹配,并且一个点云与另一个点云需要有重叠部分

3D点云配准(二多幅点云配准)

此处我们以郭浩主编的《点云库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

3D点云配准(二多幅点云配准)

思考:

对于小型或者中型数量的点云数据(点个数<100,000),我们选择ICP来进行迭代配准,可是利用对应点的特征计算和匹配较为耗时,如果对于两个大型点云(都超过100000)之间的刚体变换的确定,有什么好办法可以解决呢?

主要参考:郭浩主编的<点云库PCL从入门到精通>

上述内容,如有侵犯版权,请联系作者,会自行删文。

星球成员,可免费提问,并邀进讨论群

3D点云配准(二多幅点云配准)