全局对齐空间分布(GASD)描述符
本文描述了全局对齐的空间分布(GASD)全局描述符,用于有效的目标识别和姿态估计。
GASD基于表示对象实例的整个点云的参考系的估计,该实例用于将其与正则坐标系对齐。然后,根据对齐后的点云的三维点在空间上的分布情况计算其描述符。这种描述符还可以扩展到整个对齐点云的颜色分布。将匹配点云的全局对齐变换用于目标姿态的计算。更多信息请参见GASD。
理论基础
全局对齐空间分布(或GASD)全局描述方法将表示给定对象局部视图的三维点云作为输入。第一步是估计点云的参考帧,这允许计算将其对齐到正则坐标系的转换,从而使描述符保持不变。对齐后,根据三维点的空间分布计算出点云的形状描述符。为了获得具有较高分辨能力的形状和颜色描述符,还可以考虑沿点云的颜色分布。然后通过匹配部分视图的查询和火车描述符来执行对象识别。通过匹配查询和训练局部视图的对齐变换,计算出每个被识别对象的姿态。
采用主成分分析法(PCA)对参考框架进行估计。给定一组表示对象局部视图的3D点P i P_iPi,其中i ∈ { 1 , … n } i\in\{1,…n\}i∈{1,…n},第一步是计算它们的质心p ‾ \overline pp,这是参考系的原点。然后由p i p_ipi和p ‾ \overline pp计算协方差矩阵C CC,如下:
C = 1 n ⋅ ∑ i = 0 k ( p i − p ˉ ) ⋅ ( p i − p ˉ ) T C = \frac{1}{n}\cdot\sum_{i=0}^k(p_i-\bar p)\cdot(p_i-\bar p)^TC=n1⋅i=0∑k(pi−pˉ)⋅(pi−pˉ)T
然后,得到C CC的特征值λ j \lambda_jλj和对应的特征向量v j v_jvj,j ∈ { 1 , 2 , 3 } j\in \{1,2,3 \}j∈{1,2,3},使得C v j = λ j v j C\boldsymbol{v_j}=\lambda_j\boldsymbol{v_j}Cvj=λjvj。考虑到特征值按升序排列,采用与最小特征值相关的特征向量v 1 v_1v1作为参照系的z轴。若v 1 v_1v1与查看方向之间的角度在[ − 9 0 ∘ 、 9 0 ∘ ] [-90^{\circ}、90^{\circ}][−90∘、90∘]范围内,则舍弃v 1 v_1v1。这确保z zz轴始终指向视点方向。参考坐标系的x xx轴是与最大特征值相关的特征向量v 3 v_3v3。y yy轴由v 2 = v 1 × v 3 \boldsymbol{v_2}=\boldsymbol{v_1}\times\boldsymbol{v_3}v2=v1×v3给出。
从参照系中,可以计算一个转换[ R ∣ t ] [\boldsymbol{R} | \boldsymbol{t}][R∣t],使它与正则坐标系对齐。然后用[ R ∣ t ] [\boldsymbol{R} | \boldsymbol{t}][R∣t]转换局部视图中的所有点,定义如下:
[ R t 0 1 ] = [ v 3 T − v 3 T P ‾ v 2 T − v 2 T P ‾ v 1 T − v 1 T P ‾ 0 1 ] . \begin{bmatrix} \boldsymbol{R} & \boldsymbol{t} \\ \boldsymbol{0} & 1 \end{bmatrix}= \begin{bmatrix} \boldsymbol{v_3}^T & -\boldsymbol{v_3}^T\boldsymbol{\overline{P}} \\ \boldsymbol{v_2}^T & -\boldsymbol{v_2}^T\boldsymbol{\overline{P}} \\ \boldsymbol{v_1}^T & -\boldsymbol{v_1}^T\boldsymbol{\overline{P}} \\ \boldsymbol{0} & 1 \end{bmatrix}.[R0t1]=⎣⎢⎢⎡v3Tv2Tv1T0−v3TP−v2TP−v1TP1⎦⎥⎥⎤.
一旦使用参考帧对点云进行对齐,就可以从中计算出一个位姿不变的全局形状描述符。以原点为中心的点云轴向对齐的边界立方体被划分为m s × m s × m s m_s \times m_s \times m_sms×ms×ms规则网格。对于每个网格单元,计算带有l s l_sls bin的直方图。如果l s l_sls=1,则每个直方图bin将在3D规则网格中存储属于对应单元格的点数。如果l s l_sls>1,则计算每个单元格与云质心之间归一化距离的直方图。
每个样本对直方图的贡献根据云中的总点数进行标准化。可选地,插值可用于将每个样本的值分布到相邻的单元格中,以避免当样本从一个单元格内移动到另一个单元格时,可能导致直方图突变的边界效应。然后通过连接计算得到的直方图获得描述符。
颜色信息也可以合并到描述符中,以提高其识别能力。描述符的颜色组件是用m c × m c × m c m_c \times m_c \times m_cmc×mc×mc网格计算的,与用于形状组件的网格类似,但是根据属于它的点的颜色为每个单元生成颜色直方图。点云颜色用HSV空间表示,色调值用l c l_clc bin直方图累加。与形状分量计算类似,对点的个数进行归一化。此外,还可以对直方图样本进行插值。将形状和颜色组件连接起来,得到最终的描述符。
查询和火车描述符使用最近邻搜索方法进行匹配。然后,对于每个匹配的对象实例,使用从各自查询和训练部分视图的参考帧获得的对齐转换计算粗姿态。给定分别对齐查询和训练部分视图的转换[ R q ∣ t q ] [\mathbf{R_{q}} | \mathbf{t_{q}}][Rq∣tq]和[ R t ∣ t t ] [\mathbf{R_{t}} | \mathbf{t_{t}}][Rt∣tt],则通过以下方法获得对象的粗姿态[ R c ∣ t c ] [\mathbf{R_{c}} | \mathbf{t_{c}}][Rc∣tc]
[ R c t c 0 1 ] = [ R q t q 0 1 ] − 1 [ R t t t 0 1 ] . \begin{bmatrix} \mathbf{R_{c}} & \mathbf{t_{c}} \\ \mathbf{0} & 1 \end{bmatrix}= {\begin{bmatrix} \mathbf{R_{q}} & \mathbf{t_{q}} \\ \mathbf{0} & 1 \end{bmatrix}}^{-1} \begin{bmatrix} \mathbf{R_{t}} & \mathbf{t_{t}} \\ \mathbf{0} & 1 \end{bmatrix}.[Rc0tc1]=[Rq0tq1]−1[Rt0tt1].
粗姿态[ R c ∣ t c ] [\mathbf{R_{c}} | \mathbf{t_{c}}][Rc∣tc]可以使用迭代最近点(ICP)算法进行细化。
估计GASD特性
全局对齐的空间分布在PCL中作为pcl_features库的一部分实现。
color GASD参数的默认值是:m s m_sms=6(一半尺寸3),l s l_sls=1, m c m_cmc=4(一半尺寸2)和l c l_clc=12,没有直方图插值(INTERP_NONE)。这将产生一个包含984个浮点值的数组。它们存储在pcl::GASDSignature984点类型中。只有形状GASD参数的默认值是:m s m_sms=8(一半大小4),l s l_sls=1和三线性直方图插值(INTERP_TRILINEAR)。这将导致512个浮点值的数组,这些浮点值可以存储在pcl::GASDSignature512 点类型中。也可以使用四线性直方图插值(INTERP_QUADRILINEAR)。
下面的代码片段将估计输入彩色点云的GASD形状+颜色描述符。
#include <pcl/point_types.h>
#include <pcl/features/gasd.h>
{
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
... read, pass in or create a point cloud ...
// 创建GASD估计类,并将输入数据集传递给它
pcl::GASDColorEstimation<pcl::PointXYZRGBA, pcl::GASDSignature984> gasd;
gasd.setInputCloud (cloud);
// 输出数据集
pcl::PointCloud<pcl::GASDSignature984> descriptor;
// 计算描述符
gasd.compute (descriptor);
// 得到对齐变换
Eigen::Matrix4f trans = gasd.getTransform (trans);
// 解压缩直方图箱
for (size_t i = 0; i < size_t( descriptor[0].descriptorSize ()); ++i)
{
descriptor[0].histogram[i];
}
}
下面的代码片段将只估计输入点云的GASD形状描述符。
#include <pcl/point_types.h>
#include <pcl/features/gasd.h>
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
... read, pass in or create a point cloud ...
// 创建GASD估计类,并将输入数据集传递给它
pcl::GASDEstimation<pcl::PointXYZ, pcl::GASDSignature512> gasd;
gasd.setInputCloud (cloud);
// 输出数据集
pcl::PointCloud<pcl::GASDSignature512> descriptor;
// 计算描述符
gasd.compute (descriptor);
// 得到对齐变换
Eigen::Matrix4f trans = gasd.getTransform (trans);
// 解压缩直方图箱
for (size_t i = 0; i < size_t( descriptor[0].descriptorSize ()); ++i)
{
descriptor[0].histogram[i];
}
}
注意
@InProceedings{Lima16SIBGRAPI, author = {Joao Paulo Lima and Veronica Teichrieb}, title = {An Efficient Global Point Cloud Descriptor for Object Recognition and Pose Estimation}, booktitle = {Proceedings of the 29th SIBGRAPI - Conference on Graphics, Patterns and Images}, year = {2016}, address = {Sao Jose dos Campos, Brazil}, month = {October} }