本文主要是介绍【三维点云数据处理】SHOT三维特征描述子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【三维点云数据处理】ISS3d+CSHOT+RANSAC+ICP
【三维点云数据处理】ISS特征点提取算法
目录
一、算法原理
参考文献
二、 代码实现
三、结果展示
一、算法原理
2014年 ,Tombari等 将点签名和点特征直方图的思想相结合,提出SHOT特征描述子。首先将点邻域空间分成几个子空间,然后对子空间中每个点的法向特征统计到直方图进行编 码,再将每个子空间的直方图联合到一起得到三维描述子。此方法对于含有噪声、杂波的点云以及密度不均的点云都具有一定的鲁棒性、高效性和较好的描述性。具体过程如下:
1. 按照上图所述的协方差矩阵,通过求解可得协方差矩阵的特征值以及特征值对应的特征向量,将特征值以递减的顺序进行排列可得,其对应的向量为,分 别 代 表3个坐标轴,并记为(),记其相反方向为()为保证局部坐标系的唯一准确性,需要对局部坐标系的二义性进行消除,方法的中心思想就是近邻点与查询点组成的向量的方向尽量与查询点的法向保持一致。具体实施方法如下。以x轴为例 ,依据以下法则判定x轴方向
式中 为 采 样 点和邻域点的欧式距离。统 计 的 数 目 确 定x轴 方 向 ,当,进一步将采样点的近邻点集作为邻域点,统 计 的数目确定方向。由上述 方法确定z、x轴 方 向 ,y轴方向由z×x确定 ,至此局部参考坐标系二义性消除 ,局部参考坐标系被唯一 确定.
2. 特征点邻域的空间划分。对特征点的邻域进行空间划分,沿方位划分为8份 ,沿高度划分为2 份,沿半径划分为2份 ,邻域空间总共划分为32份 .
3. 计算局部直方图。局部参考坐标系确定后, 选取采样点R邻域内其他点法向量采样点局部参考坐标系的z轴方向向量的夹角余弦作为 函 数 值 如 式(11),将其累计到直方图不同的盒子中. 对每个子空间将的值划分11份,SHOT描 述 子 的 维 度 为 32×11=352 维 。
参考文献
[1]陆军,邵红旭,王伟,范哲君,夏桂华.基于关键点特征匹配的点云配准方法[J].北京理工大学学报,2020,40(04):409-415.DOI:10.15918/j.tbit1001-0645.2018.476.
二、 代码实现
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;typedef pcl::PointXYZ PointType;
typedef pcl::Normal NormalType;typedef pcl::SHOT352 DescriptorType;
创建SHOT特征估计器
pcl::SHOTEstimationOMP<PointType, NormalType, DescriptorType> descr_est
// Calc SHOTColor feature descriptorspcl::SHOTColorEstimation<PointT, pcl::Normal, SHOTSignT, PointRef> cshot_src;//pcl::search::KdTree<PointT>::Ptr tree_cshot_src(new pcl::search::KdTree<PointT>);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<SHOTSignT>(*rCSHOTDesc_src)<< endl;plotter->addFeatureHistogram<SHOTSignT>(*rCSHOTDesc_src, "shot", 5, "one_SHOT");/*第2个参数为点云类型的field name,5表示可视化第五个点的FPFH特征该参数可通过getFieldsList()返回,并且只限定于注册过的点云类型*/plotter->setWindowSize(800, 600);plotter->spinOnce(30000000);plotter->clearPlots();
注意事项
plotter->addFeatureHistogram<SHOTSignT>(*rCSHOTDesc_src, "shot", 5, "one_SHOT");
上述代码添加特征直方图时第二个参数可由pcl::getFieldsList<SHOTSignT>()
显示出来。
cout << pcl::getFieldsList<SHOTSignT>(*rCSHOTDesc_src)<< endl;
三、结果展示
SHOT特征描述子可视化:
这篇关于【三维点云数据处理】SHOT三维特征描述子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!