【PCL自学:Feature9】全局对齐空间分布(GASD)描述符 (持续更新)

一、全局对齐空间分布(GASD)描述符介绍

  此篇文章描述了全局对齐空间分布([GASD])全局描述符,用于有效的对象识别和姿态估计。
  GASD基于表示对象实例的整个点云参考框架的估计,该参考框架用于将其与规范坐标系对齐。然后,根据其三维点的空间分布,为对齐的点云计算描述符。这样的描述符也可以扩展到整个对齐点云的颜色分布。利用匹配点云的全局对齐变换来计算目标的姿态。更多信息参见此篇论文

【理论基础:】
  全局对齐的空间分布(global Aligned Spatial Distribution,简称GASD)全局描述方法以表示给定对象部分视图的3D点云作为输入。第一步估计点云的参考框架(以点云自身建立的坐标系),用于计算将其对准标准坐标系的转换,使描述符保持姿态不变性。对齐后,根据三维点的空间分布计算点云的形状描述符。还可以考虑点云的颜色分布,从而得到具有较高分辨力的形状和颜色描述符。最后通过匹配部分视图的查询和训练描述子**(我理解查询描述子是对待匹配点云的描述子计算,训练描述子时对物体点云的描述子计算)**进行对象识别。每个识别对象的姿态也利用匹配查询和训练部分视图的对齐转换来计算。
  对于第一步点云的参考框架估计使用主成分分析(PCA)方法估计参考框架。给定一组3D点( P i {P_i} Pi),表示一个对象的局部视图,其中 i ∈ { 1 , … , n } i\in\{1,…, n\} i{1n},第一步是计算它们的质心 P ‾ {\overline{P}} P,它是参考坐标系的原点。然后由 P i {P_i} Pi P ‾ {\overline{P}} P计算协方差矩阵 C {C} C如下所示。
在这里插入图片描述
  然后,得到 C {C} C的特征值 λ j \lambda_j λj及其对应的特征向量。考虑到特征值是按升序排列的,采用与最小特征值相关的特征向量 v 1 {v_1} v1作为参考坐标系的z轴。如果 v 1 {v_1} v1与观测方向的夹角在 [ − 9 0 ∘ , 9 0 ∘ ] [-90^{\circ}, 90^{\circ}] [9090]范围内,则 v 1 {v_1} v1取反。这确保了这片点云的z轴始终指向观看者。参考坐标系的x轴是与最大特征值相关联的特征向量 v 3 {v3} v3。y轴由 v 2 {v_2} v2= v 1 {v_1} v1× v 3 {v3} v3表示(叉乘)。
  从参考坐标系中,可以计算一个变换j矩阵 [ R ∣ t ] [\boldsymbol{R} | \boldsymbol{t}] [Rt],使其与标准坐标系对齐。然后将局部视图中所有的点 ( P i ) (P_i) (Pi)经过 [ R ∣ t ] [\boldsymbol{R} | \boldsymbol{t}] [Rt]进行转换,其定义如下:
在这里插入图片描述
  一旦点云将参考框架对齐,一个姿态不变的全局形状描述符就可以计算了。以原点为中心的点云轴对齐的边界立方体被划分为 m s   × m s   × m s m_s \ × m_s \ × m_s ms ×ms ×ms正则网格。对于每个网格单元,计算带有 l s b i n s l_s bins lsbins的直方图。如果 l s = 1 l_s=1 ls=1,那么每个直方图bin将存储属于3D规则网格中相应单元格的点的数量。如果是 l s > 1 l_s>1 ls>1,那么对于每个单元格,将计算每个单元格与云质心之间归一化距离的直方图。
  每个样本对直方图的贡献是相对于云中的总点数归一化的。可选地,插值可以用来将每个样本的值分配到相邻的单元格中,以避免当一个样本从一个单元格转移到另一个单元格时可能导致直方图突然变化的边界效应。然后,通过连接计算得到的直方图来获得描述符。
【PCL自学:Feature9】全局对齐空间分布(GASD)描述符 (持续更新)_第1张图片
  颜色信息也可以被合并到描述符中,以增加其鉴别能力。描述符的颜色组件是用 m c   × m c   × m c m_c \ × m_c \ × m_c mc ×mc ×mc网格计算的,类似于形状组件使用的网格,但每个单元格的颜色直方图是基于属于它的点的颜色生成的。点云颜色在HSV空间中表示,色调值在 l c l_c lc容器的直方图中累积。与形状分量计算类似,对点数进行归一化。此外,还可以对直方图样本进行插值。形状和颜色组件被连接起来,产生最终的描述符。
  使用最近邻搜索方法(KDtree)匹配查询和训练描述符。然后,对于每个匹配的对象实例,使用从各自查询和训练部分视图的参考帧获得的对齐转换 来计算粗姿态。通过对查询和训练部分视图分别进行变换 [ R q ∣ t q ] [\mathbf{R_{q}} | \mathbf{t_{q}}] [Rqtq] [ R t ∣ t t ] [\mathbf{R_{t}} | \mathbf{t_{t}}] [Rttt],得到对象的粗位姿 [ R c ∣ t c ] [\mathbf{R_{c}} | \mathbf{t_{c}}] [Rctc].
在这里插入图片描述
  然后使用迭代最近点(ICP)算法对粗位姿 [ R c ∣ t c ] [\mathbf{R_{c}} | \mathbf{t_{c}}] [Rctc]进行细化。ICP相关内容可以参考这篇博文。

二、全局对齐空间分布(GASD)示例代码分析

  全局对齐的空间分布是作为pcl_features库的一部分在PCL中实现的。带颜色信息的GASD参数的默认值是: m s = 6 m_s=6 ms=6(大小为3的一半), l s = 1 l_s=1 ls=1, m c = 4 m_c=4 mc=4(大小为2的一半)和 l c = 12 l_c=12 lc=12,没有直方图插值(INTERP_NONE)。这将得到一个包含984个浮点值的数组。它们存储在pcl::GASDSignature984点类型中。只有形状信息的GASD参数的默认值是: m s m_s ms=8(4的一半大小), l s = 1 l_s=1 ls=1和三线性直方图插值(INTERP_TRILINEAR)。这将产生一个包含512个浮点值的数组,该数组可以存储在pcl::GASDSignature512点类型中。也可以使用四线性直方图插值(interp_quadrillinear)。
  下面的代码片段将估计输入彩色点云的GASD形状+颜色描述符。

#include 
#include 
 
 {
   pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
 
   //这里需加入读入PCD格式点云或者创造点云相关代码,不再赘述
 
   // 创建GASD估计类,并且将点云数据压入其中。
  pcl::GASDColorEstimation<pcl::PointXYZRGBA, pcl::GASDSignature984> gasd;
  gasd.setInputCloud (cloud);

  // 声明一个有颜色信息和形状信息的GASD描述符共984格浮点数表示
  pcl::PointCloud<pcl::GASDSignature984> descriptor;

  // 开始计算描述子
  gasd.compute (descriptor);

  // 获取对齐变换矩阵
  Eigen::Matrix4f trans = gasd.getTransform (trans);

  // 解压缩直方图
  for (std::size_t i = 0; i < std::size_t( descriptor[0].descriptorSize ()); ++i)
  {
    descriptor[0].histogram[i];
  }
}

  下面的代码片段将仅仅估计输入点云的GASD形状描述符。唯一的区别就是描述子声明pcl::GASDSignature984改为pcl::GASDSignature512。

#include 
#include 

{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

  //这里需加入读入PCD格式点云或者创造点云相关代码,不再赘述

  // 创建GASD估计类,并且将点云数据压入其中。
  pcl::GASDEstimation<pcl::PointXYZ, pcl::GASDSignature512> gasd;
  gasd.setInputCloud (cloud);

  // 声明一个有颜色信息和形状信息的GASD描述符共512格浮点数表示
  pcl::PointCloud<pcl::GASDSignature512> descriptor;

  // 开始计算描述子
  gasd.compute (descriptor);

   // 获取对齐变换矩阵
  Eigen::Matrix4f trans = gasd.getTransform (trans);

  // 加压缩直方图
  for (std::size_t i = 0; i < std::size_t( descriptor[0].descriptorSize ()); ++i)
  {
    descriptor[0].histogram[i];
  }
}

总结:本篇文章简单介绍了GASD的作用和原理,并结合官网示例代码进行了分析。至此PCL的Feature模块全部介绍完毕。


【博主简介】
  斯坦福的兔子,男,天津大学机械工程工学硕士。毕业至今从事光学三维成像及点云处理相关工作。因工作中使用的三维处理库为公司内部库,不具有普遍适用性,遂自学开源PCL库及其相关数学知识以备使用。谨此将自学过程与君共享。
博主才疏学浅,尚不具有指导能力,如有问题还请各位在评论处留言供大家共同讨论。
若前辈们有工作机会介绍欢迎私信。

你可能感兴趣的:(PCL,算法,机器学习,算法,深度学习)