【三维点云数据处理】SHOT三维特征描述子

【三维点云数据处理】ISS3d+CSHOT+RANSAC+ICP

【三维点云数据处理】ISS特征点提取算法


目录

一、算法原理

参考文献

二、 代码实现

三、结果展示


一、算法原理

2014年 ,Tombari等 将点签名和点特征直方图的思想相结合,提出SHOT特征描述子。首先将点邻域空间分成几个子空间,然后对子空间中每个点的法向特征统计到直方图进行编 码,再将每个子空间的直方图联合到一起得到三维描述子。此方法对于含有噪声、杂波的点云以及密度不均的点云都具有一定的鲁棒性、高效性和较好的描述性。具体过程如下:

【三维点云数据处理】SHOT三维特征描述子_第1张图片

1. 按照上图所述的协方差矩阵,通过求解可得协方差矩阵的特征值以及特征值对应的特征向量,将特征值以递减的顺序进行排列可得\lambda_{1}> \lambda_{2}>\lambda_{3},其对应的向量为v_{1},v_{2},v_{3},分 别 代 表x,y,z3个坐标轴,并记为(x^{+},y^{+},z^{+}),记其相反方向为(x^{-},y^{-},z^{-})为保证局部坐标系的唯一准确性,需要对局部坐标系的二义性进行消除,方法的中心思想就是近邻点与查询点组成的向量的方向尽量与查询点的法向保持一致。具体实施方法如下。以x轴为例 ,依据以下法则判定x轴方向

【三维点云数据处理】SHOT三维特征描述子_第2张图片

式中d_{i} 为 采 样 点p和邻域点p_{i}的欧式距离\begin{Vmatrix} p_{i}-p \end{Vmatrix}。统 计s^{+},s^{-} 的 数 目 确 定x轴 方 向 ,当\begin{vmatrix} s^{+} \end{vmatrix}= \begin{vmatrix} s^{-} \end{vmatrix},进一步将采样点的k近邻点集M_{k}作为邻域点,统 计S_{x}^{+},S_{x}^{-} 的数目确定方向。由上述 方法确定z、x轴 方 向 ,y轴方向由z×x确定 ,至此局部参考坐标系二义性消除 ,局部参考坐标系被唯一 确定.
 2. 特征点邻域的空间划分。对特征点的邻域进行空间划分,沿方位划分为8份 ,沿高度划分为2 份,沿半径划分为2份 ,邻域空间总共划分为32份 .
 3. 计算局部直方图。局部参考坐标系确定后, 选取采样点R邻域内其他点法向量n_{q}采样点局部参考坐标系的z轴方向向量z_{k}的夹角余弦作为 函 数 值 如 式(11),将其累计到直方图不同的盒子中. 对每个子空间将cos\theta的值划分11份,SHOT描 述 子 的 维 度 为 32×11=352 维 。

cos\theta = z_{k}n_{q} (11)

参考文献

[1]陆军,邵红旭,王伟,范哲君,夏桂华.基于关键点特征匹配的点云配准方法[J].北京理工大学学报,2020,40(04):409-415.DOI:10.15918/j.tbit1001-0645.2018.476.


二、 代码实现

typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud PointCloud;

typedef pcl::PointXYZ PointType;
typedef pcl::Normal NormalType;

typedef pcl::SHOT352 DescriptorType;

创建SHOT特征估计器 

pcl::SHOTEstimationOMP descr_est

    // Calc SHOTColor feature descriptors
    pcl::SHOTColorEstimation cshot_src;
    //pcl::search::KdTree::Ptr tree_cshot_src(new pcl::search::KdTree);
    cshot_src.setSearchMethod(modelKdTree_src);
    cshot_src.setInputCloud(iKeypoints_src);
    cshot_src.setInputNormals(iCloud_src_normals);
    cshot_src.setRadiusSearch(cshotparm::radius_dense);
    cshot_src.setSearchSurface(iCloud_src);
    PointCloudSHOTDesc::Ptr rCSHOTDesc_src(new PointCloudSHOTDesc());
    cshot_src.compute(*rCSHOTDesc_src);
    std::cout << "------> Computed *rCSHOTDesc_src SHOTColor descriptor values ..." << std::endl;
    std::cout << rCSHOTDesc_src->is_dense << std::endl;
    std::cout << rCSHOTDesc_src->size() << std::endl;

    // ---------------直方图可视化-----------------

    //定义绘图器
    pcl::visualization::PCLPlotter* plotter = new pcl::visualization::PCLPlotter("My Plotter");
    //设置特性
    plotter->setTitle("SHOT");
    plotter->setShowLegend(true);
    cout << pcl::getFieldsList(*rCSHOTDesc_src)<< endl;
    plotter->addFeatureHistogram(*rCSHOTDesc_src, "shot", 5, "one_SHOT");/*第2个参数为点云类型的field name,5表示可视化第五个点的FPFH特征该参数可通过getFieldsList()返回,并且只限定于注册过的点云类型*/
    plotter->setWindowSize(800, 600);
    plotter->spinOnce(30000000);
    plotter->clearPlots();

 注意事项

 plotter->addFeatureHistogram(*rCSHOTDesc_src, "shot", 5, "one_SHOT");

上述代码添加特征直方图时第二个参数可由pcl::getFieldsList()显示出来。

cout << pcl::getFieldsList(*rCSHOTDesc_src)<< endl;


三、结果展示

SHOT特征描述子可视化:

【三维点云数据处理】SHOT三维特征描述子_第3张图片

 

 

你可能感兴趣的:(三维点云处理,开发语言,c++,计算机视觉,3d)