点云处理学习笔记(七)-- 特征描述 Spin Image

一、Spin Image

       Spin Image是基于点云空间分布的最经典的特征描述方法,其思想是将一定区域的点云分布转换成二维的Spin Image,然后对场景和模型的Spin Image进行相似性度量:

       P:三维网格某顶点p的切面

       n:p点单位法向量

       x:p附近的三维网格上的另一个顶点

       α:x点在P上的投影与p的距离

       β:x点与P点的垂直距离

      其中p和n定义为一个定向点(oriented point)

二、生成Spin Image的步骤

      1.定义一个Oriented Point

      2.以Oriented Point为轴生成一个圆柱坐标系

      3.定义Spin Image的参数,Spin Image是一个具有一定大小(行数列数)、分辨率(二维网格大小)的二维图像(或者说是网格)。

      4.将圆柱体内的三维坐标​投影到二维Spin image,这一过程可以理解为一个Spin image绕着法向量n旋转360度,Spin image扫到的三维空间的点会落到Spin image的网格中。就是如下的公式:

      5.根据Spin Image中的每个网格中落入的点不同,计算每个网格的强度I,显示Spin Image时以每个网格(也就是像素)I不同为依据。最直接的方法是直接计算每个网格中落入的点,然而为了降低对位置的敏感度降低噪音影响增加稳定性,Johnson论文中用双线性插值的方法将一个点分布到4个像素中。原理如下图:

       上图中,默认的网格边长是1(但并非真实的边长),当一个点落入网格(i, j)中时,就会被双线性插值分散到(i, j), (i, j+1), (i+1, j), (i+1, j+1)四个网格中,这样就获得了Spin Image:

      Spin Image绕着选择顶点的法向量自转360°,将所到之处的指点全部沾在二维图像上,累积成为一副图像,再经过处理就成为了Spin Image。

三、Spin Image的三个关键参数

       1.分辨率:即二维网格中像素的实际尺寸,使用和三维网格相近的尺寸比较合适,因此通常是取三维网格所有边的平均值作为Spin Image的每个网格尺寸,通常会把网格的长和宽定义成相等,即边长:

       e为三维网格模型中的一条边,N为三维网格中的边的总数;

       2.大小:即Spin Image的行数和列数,两者一般也是相等的;

       3.Support Angle:即法向量家教的大小限制,空间中顶点的法向量和创建圆柱坐标系所选点法向量之间的夹角:

      对角度进行限制之后,相对于切面的“凹点(大于90°)”被剔除,保留了主要信息,降低了后续的计算量,一般角度的限制范围在60°到90°之间。

四、Spin Image特征匹配中的相似性度量和匹配时点的选择

       1.相似性度量

        使用以下公式来计算两个Spin Images之间的相似性:

        其中R的计算公式:

        N为每个Spin Image的像素数,atanh为反双曲正切函数,其输入的范围是[-1, 1],这是一种典型的统计学手段,R的取值范围是[-1, 1],两个Spin Images越相似,R越接近于1,完全一样时R的值为1。

        可以看出C由两部分组成:第一部分时经反双曲正切函数得出的值的平方,第二部分是一个权重λ乘以一个较小的数,当两个Spin Images相似时第二部分所占的比重应该较小,当不接近时第二部分所占比重应该较大。λ的作用是用来限制Spin Images低重合时匹配的情况,λ的选择方式时将所有的Spin Images中的非空像素数按大小顺序列出来然后取中位数,这个中位数差不多是像素重叠的期望值,然后考虑到低重叠的情况,取这个中位数的一半来作为λ。

        三维模型与场景匹配按下图的流程来进行:

        在计算出相关系数后,由于模型的对称部分或者目标点附近的点的干扰,在场景中可能会有不止一个点与目标点的特征相近匹配,因此在确定Plausible Transformations之前需要进行过滤和多元组的匹配。

        2.模型和场景匹配时点的选择:

        两个三维模型进行匹配至少得要有三个点可以匹配:

        对三维场景点的额选择:通过对形状编码确保均匀抽样,通过选择有精确法向量的Spin Image来提高匹配的几率,无杂点的完美模型一般随机选择10%的点就可以,实际运用中一般选择1/20 -- 1/2。

五、总结

       Spin Image对遮挡和背景干扰具有很强的强健性,在点云配准和三维目标识别中得到广泛应用,其不足之处在于不具有尺度不变性,需要较大的存储空间和要求点云均匀分布。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BSC(Binary Shape Context)是一种基于二进制编码的点云特征描述子,它可以用于点云配准、分类、识别等任务中。 BSC特征描述子的计算过程如下: 1. 首先,选取一个参考点作为原点,并计算其他点相对于该点的极坐标(距离、俯仰角、方位角); 2. 然后,将每个点的极坐标转化成一个二进制编码,这里采用的是自适应二进制编码(Adaptive Binary Encoding); 3. 接着,对于每个点,以它为中心,计算与它相邻的点的二进制编码的直方图,这个直方图就是该点的BSC特征描述子。 BSC特征描述子的优点是具有旋转不变性和尺度不变性,因为它是基于相对位置和二进制编码计算的。此外,BSC特征描述子还可以通过使用多个参考点来获得更好的描述性能。 以下是BSC特征描述子的C++代码实现,假设点云数据已经存储在pcl::PointCloud<pcl::PointXYZ>类型的变量中: ```c++ #include <pcl/features/normal_3d.h> #include <pcl/features/shot_omp.h> #include <pcl/features/brisk_2d.h> #include <pcl/visualization/pcl_visualizer.h> int main() { // Load point cloud data pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("cloud.pcd", *cloud); // Estimate surface normals pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; ne.setInputCloud(cloud); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); ne.setSearchMethod(tree); pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); ne.setRadiusSearch(0.03); ne.compute(*normals); // Compute BSC features pcl::BSCSignatures2019<pcl::PointXYZ, pcl::Normal, pcl::Histogram<32>> bsc; bsc.setInputCloud(cloud); bsc.setInputNormals(normals); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZ>); bsc.setSearchMethod(tree2); bsc.setRadiusSearch(0.03); pcl::PointCloud<pcl::Histogram<32>>::Ptr descriptors(new pcl::PointCloud<pcl::Histogram<32>>); bsc.compute(*descriptors); // Visualize BSC features pcl::visualization::PCLVisualizer viewer("BSC Features"); viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud"); viewer.addPointCloud<pcl::PointXYZ>(cloud, "sampled_cloud"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sampled_cloud"); viewer.addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 10, 0.02, "normals"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0.0, 1.0, 0.0, "normals"); viewer.addPointCloudFeature<pcl::PointXYZ, pcl::Histogram<32>>(cloud, descriptors, "features"); viewer.spin(); return 0; } ``` 这个代码使用了PCL库中的BSCSignatures2019类来计算BSC特征描述子,其中输入参数包括点云、法向量、搜索半径等。在计算完BSC特征描述子后,代码通过PCL库的可视化模块将点云、法向量和BSC特征描述子可视化出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值