浅谈三维形状上下文特征3DSC理论及应用

目录

        一. 简介

        二. 原理与实现

        三. 代码

        总结

        Reference

在之前的博客中,我们已经介绍过了使用FPFH在点云上建立局部形状描述,实现对点云局部隐曲面几何特征的高效表达(浅谈FPFH算法实现原理及其在点云配准中的应用)。今天,我们将介绍另外一种局部形状描述子, 即三维形状上下文特征3D Shape Context (3DSC)[1]。最近上课需要准备这部分内容,本打算找一个现成的资料学习一下了事的。但是看了几个博客,感觉还是差点意思,于是我下载了原始论文,从头读了一遍,将一些原理与实现细节在这篇博客做个展开,希望能够帮助到有需要的同学。


一. 简介

在受到噪声污染,且数据分布不规则的三维场景中,实现对目标物体的识别,通常是比较困难的。为了实现对目标物体几何特性的表述,且获取对噪声和不规则数据分布的鲁棒性,3DSC被提出。作为一种经典的局部形状描述子,3DSC很好的利用了三维数据分布的统计特性,在几何信息表达与抗噪声两个任务目标中建立了比较平衡的解决方案。

整体来说,一个好的局部形状描述子应该具备三方面的优势:第一,能够对噪声和因遮挡而产生的数据缺陷具有一定鲁棒性;第二,能够精确的描述三维对象的几何信息;第三,能够处理低分辨率数据,至少能够建立相对稳定的特征表达。上述特性对于设计配准与定位算法十分重要。考虑到shape context方法在图像领域的成功应用[2],基于类似的原理,3DSC被提出用于建立对三维点云的几何特征描述,同时满足上述对局部形状描述子的需求。下面我们就来具体介绍下3DSC的原理以及实现方法。


二. 原理与实现

类似于其他的统计形状特征,3DSC的目标是建立一个对局部区域点分布的表示形式。该表示形式需要清晰的描绘出每一个点的临近区域内,点的密度以及对应分布的几何特性。一个直观的想法就是对一点建立一个局部空间。基于该空间,划分不同的区域,并计算这些区域的点数。之后,将每个区域的点数作为直方图的一个bin数据项,将所有的区域构建成不同的bin,最终获得直方图。由于该局部空间的划分对于所有的点都是相同的,那么bin的数据分布直接描述了每一个点不同的几何特性。这样就满足了对局部形状描述子的基本要求。

存在一个点云数据P,p为其中一点,n为p的法向。考虑这样一个球空间(图1),以p为球心,以n为球的正北方向,这样就建立起一个局部的球形空间。按照半径和两个角度(方位角和仰角)方向分别取J+1,K+1和L+1个分段。这样,我们就获得一个具有J * K * L个bin的直方图数据表示。这里的半径分段使用了一个对数运算,方程如下:

其中r_max和r_min是球形空间半径的边界。之所以要设定一个r_min而不是直接取0,是因为靠近中心的bin的区域太小,获取的数据往往失去了统计意义。因此,设定一个r_min以及使用对数函数进行变换,以防止点分布在小半径区域失去统计意义。 

图1. 球空间的可视化示意图。

在此基础上,我们需要为每一个bin设置一个对应的权重,以方便在之后建立赋权的数据分析结果。权重公式如下:

V(j,k,l)对应的是bin的体积,ρi对应的是局部的点密度,pi为在p定义的球空间内的点。ρi基于点数与pi对应的半径来估计得到。原文中没有对ρi给出非常具体的解释,我认为就是V(j,k,l)除以该bin的点数,即为密度。通过上述计算,我们统计每一个bin中赋权后的点数,得到直方图数据,即为3DSC。可以看到,3DSC与FPFH很像,只是用位置信息替换了角度信息。


三. 代码

#include <iostream>

#include <pcl/io/pcd_io.h>
#include <pcl/features/3dsc.h>
#include <pcl/features/normal_3d.h>

int
main (int, char** argv)
{
  std::string filename = argv[1];
  std::cout << "Reading " << filename << std::endl;
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

  if (pcl::io::loadPCDFile <pcl::PointXYZ> (filename, *cloud) == -1)
  // load the file
  {
    PCL_ERROR ("Couldn't read file\n");
    return (-1);
  }
  std::cout << "Loaded " << cloud->size () << " points." << std::endl;

  // Compute the normals
  pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimation;
  normal_estimation.setInputCloud (cloud);

  pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree (new pcl::search::KdTree<pcl::PointXYZ>);
  normal_estimation.setSearchMethod (kdtree);

  pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud< pcl::Normal>);
  normal_estimation.setRadiusSearch (0.03);
  normal_estimation.compute (*normals);

  // Setup the shape context computation
  pcl::ShapeContext3DEstimation<pcl::PointXYZ, pcl::Normal, pcl::ShapeContext1980> shape_context;

  // Provide the point cloud
  shape_context.setInputCloud (cloud);
  // Provide normals
  shape_context.setInputNormals (normals);
  // Use the same KdTree from the normal estimation
  shape_context.setSearchMethod (kdtree);
  pcl::PointCloud<pcl::ShapeContext1980>::Ptr shape_context_features (new pcl::PointCloud<pcl::ShapeContext1980>);

  // The minimal radius is generally set to approx. 1/10 of the search radius, while the pt. density radius is generally set to 1/5
  shape_context.setRadiusSearch (0.2);
  shape_context.setPointDensityRadius (0.04);
  shape_context.setMinimalRadius (0.02);

  // Actually compute the shape contexts
  shape_context.compute (*shape_context_features);
  std::cout << "3DSC output size (): " << shape_context_features->size () << std::endl;

  // Display and retrieve the shape context descriptor vector for the 0th point.
  std::cout << (*shape_context_features)[0] << std::endl;
  //float* first_descriptor = (*shape_context_features)[0].descriptor; // 1980 elements

  return 0;
}

总结

3DSC就是在点的局部做了一个统计分析。对提升噪声与随机分布的鲁棒性来说,3DSC的好处当然是显而易见的。在局部球形空间的特征表达,3DSC对于一些点的随机扰动不敏感,因此也就比一般的曲率特征具有一定优势。但是细心的读者一定会发现,对于一点的3DSC特征提取,必然会在一定程度上受限于法线的精度。因为球空间的方向定位是由法线决定的。如果法线估计出现了不可忽视的误差,那么3DSC特征的精度必然会受到影响。我们将在下一篇博客介绍针对3DSC特征受法向扰动的解决方案,即调和形状上下文特征(Harmonic shape contexts)。


Reference

[1] A. Frome, et al. Recognizing objects in range data using regional point descriptors [C]. ECCV, 2004: 224-237.

[2] S. Belongie, et al. Shape matching and object recognition using shape contexts [J]. TPAMI, 24(4):509-522.

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值