今天在看熊风光同学博士论文《三维点云配准技术研究》,觉得作者总结的对我这个入门小白很受用,于是就接着逐个学习三维计算机视觉的一些局部特征。
看到了大佬的博客 https://blog.****.net/app_12062011/article/details/78168953 很详细,我也顺便搜到了参考文献中Andrew Edie Johnson的1997年的那篇博士原文《Spin-Images: A Representation for 3-D Surface Matching》。
现记录一些我觉得上面博客没有点出的,对我困扰很大的问题。
1、网格分辨率
作者专门给出了网格分辨率的定义,应该是网格中所有边缘长度的中位数。对分辨率的定义与图像处理中使用的分辨率的定义具有相反的含义。 与图像处理一样,分辨率随着采样的添加而增加,采样减少了而减少。 但是,网格分辨率的度量----边长,随着采样的增加而减少,随着采样的减少而增加。
2、生成 Spin Image 的步骤
大写P------三维网格某顶点p的切面
n-------p点单位法向量
x-------p附近的三维网格上的另一个顶点
α------x点在P上投影与p的距离
β------x点与P点的垂直距离
其中p和n定义为一个定向点(Oriented point)。
这的意思应该是说将点p和其法向量n作为基,然后这就变成了一个两个维度的坐标系。空间中的任一点x可以用它到n的距离a和到平面P的距离b来确定(才怪!因为明显还是缺少了一个角度),原文中也有提到说是一个缺少极坐标的圆柱坐标系。因为会导致在空间上不在一起的顶点变换之后有相同的(α,β)坐标。
1.定义一个Oriented point
2.以Oriented point为轴生成一个圆柱坐标系
3.定义Spin image的参数,Spin image是一个具有一定大小(行数列数)、分辨率(二维网格大小)的二维图像(或者说网格)。Spin image的三个关键参数将在后面讨论。
4.将圆柱体内的三维坐标投影到二维Spin image,这一过程可以理解为一个Spin image绕着法向量n旋转360度,Spin image扫到的三维空间的点会落到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)四个网格中。
我觉得这里是说落在了Bin中更合适。
这样就获得了spin image,如下图所示。
总结一下:某一点p的Spin Image就是用点p和其法向量n为基,把所有点云做的一个3D->2D映射。点云中任一点x,映射为到n的距离和到P平面距离一个二维坐标。很明显还可能存在其他不同于x的点,但是和x的二维坐标相同。可以想象成,拿一个中国象棋棋盘,找一个帅的位置与点p重合,摆棋子的一排与n重合。棋格的距离就是bin size,棋盘的长宽相等,就是image width,而文中所说的support distance = bin size * image width
然后你就开始转动棋盘,记录点云落在每个棋盘的个数(就是强度),转过的角度就是文中所说的support angle。
初学小白,要是有理解不对的地方望大神指出!
还是要看一下PCL中实现的代码,验证自己的理解