欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
简介
参考论文:Unique Signatures of Histograms for Local Surface
关注公众号并回复SHOT
可以获取文章下载链接。
SHOT是一种定义在网格表面的直方图签名特征算子。可以被于目标物体检测和网格表面拼接等应用。
计算步骤:
- 支撑区域定义
- 局部标架计算
- 把支撑区域划分成多个格子
- 对支撑区域内所有点计算权重,并加权到相关的格子
支撑区域定义
支持区域可以理解为一个体积固定的区域,比如边长固定的正方体,半径固定的球体等等。
文章中是用球体来作为支撑区域。
一般会从点集中采样出一些点,作为关键特征点。以一个特征点为球心,R为半径就形成了一个支撑区域,支撑区域所包围的点叫支撑点集。
局部标架
局部标架是以支撑点集为输入计算出来的一个迪卡尔坐标系,需要得到原点以及x,y,z轴的具体朝向。
主成分分析法:
设支撑区域点集 P = { p 1 , p 2 , . . . , p n } 设支撑区域点集P=\{p_1, p_2, ... , p_n\} 设支撑区域点集P={p1,p2,...,pn}
M = 1 n ∑ i = 1 n ( p i − p ) ( p i − p ) T , p = 1 n ∑ i = 1 n p i \displaystyle M=\frac 1 n \sum_{i=1}^n(p_i-p)(p_i-p)^T, p = \frac 1 n \sum_{i=1}^n p_i M=n1i=1∑n(pi−p)(pi−p)T,p=n1i=1∑npi
对M进行特征值分解,取最大特征值对应的特征向量为其中z轴,p为原点。
将所有点投影到z轴与p点组成的平面,取与p点离最远的投影点与p点连线为x轴,然后计算出y轴
这个方法只能确定一个轴向,需要通过别的方法来确定剩下的轴,不够鲁棒。
带权重的成分分析法
设支撑区域点集 P = { p 1 , p 2 , . . . , p n } 设支撑区域点集P=\{p_1, p_2, ... , p_n\} 设支撑区域点集P={p1,p2,...,pn}
M = 1 ∑ i = 1 n ( R − d i ) ∑ i = 1 n ( R − d i ) ( p i − p ) ( p i − p ) T \displaystyle M=\frac 1 {\sum_{i=1}^n(R-d_i)} \sum_{i=1}^n(R-d_i)(p_i-p)(p_i-p)^T M=∑i=1n(R−di)1i=1∑n(R−di)(pi−p)(pi−p)T
p 为采样到的特征点, d i = ∥ p i − p ∥ 2 p为采样到的特征点,d_i = \|p_i-p\|_2 p为采样到的特征点,di=∥pi−p∥2
对M进行特征值分解
特征值从大到小对应的特征向量分别作为 x + , y + , z + 特征值从大到小对应的特征向量分别作为x^+,y^+, z^+ 特征值从大到小对应的特征向量分别作为x+,y+,z+
如果直接拿上述结果作为坐标系,方向上会存在二义性。
利用投票消除二义性
令 x − , y − , z − 作为 x + , y + , z + 的反方向 令x^-,y^-, z^-作为x^+,y^+, z^+的反方向 令x−,y−,z−作为x+,y+,z+的反方向
对x轴进行投票
S x + = { i : ( p i − p ) ⋅ x + ≥ 0 } S x − = { i : ( p i − p ) ⋅ x − > 0 } x = { x + , ∣ S x + ∣ ≥ ∣ S x − ∣ x − , o t h e r w i s e \begin{array}{l} S_x^+=\{i:(p_i-p)\cdot x^+ \ge 0\}\\ S_x^-=\{i:(p_i-p)\cdot x^- \gt 0\}\end{array}\\\\ \ \ x=\left \{\begin{array}{l} x^+, |S_x^+|\ge|S_x^-|\\ x^-,otherwise\end{array} \right. Sx+={i:(pi−p)⋅x+≥0}Sx−={i:(pi−p)⋅x−>0} x={x+,∣Sx+∣≥∣Sx−∣x−,otherwise
对z轴也作上述有类似的投票操作,y轴由zXx得到。
区域划分
从经度上把球分成8分(上图中只有4分)
纬度上从赤道处把球分成2份
内外径上把球分成2分
这样整个球被分成了8*2*2 =32块。
每块内部分都分配了一个长度11的数组weight,把余弦值从0到1平均分布在数组里
为了计算方便全部乘上10.
通过以上操作后,每个支撑区域都可以得到一个32*11=352维的特征向量。
用一个特征数组来表示float shot_feature[8][2][2][11],理论推导可以使用数组,具体实现可以转成一维数组来做。
特征向量的值是由支撑点对附近划分出来的块进行插值权重累加得到。
以上块的划分可以自由组合,比如经度可以划分成2块或者4块,块内部的数组长度也可以变化。考虑到运行效率,论文里提到的数据在实际项目中并不是最优的
插值过程
这块文章中给的说明比较少,很难理解,我也是学习了很久才理解。
文章中提到四线性插值,其实是指对4个维度分别做单线性插值。
正方体模型插值
为了理解方便,把模型简化一下。
假设支撑区域为正方体,将从x,y,z的维度 分别将正方体分成3份,这样得到27个格子边长为1。
每块内部分都分配了一个长度11的数组bin,把余弦值从0到1平均分布在数组里
为了计算方便全部乘上10.
用数组表示float shot_feature[2][2][2][11] 。
对每层编号如图, 14号格子中心点为原点,横向(14到15)为X轴纵向(14到11)为Z轴,14到5为Y轴
假设现在有一点pi(0.8,0.3,0.4)落在15号格子,偏向邻近的14,6,12号格子,pi法向与z轴夹角cos值为0.22。
pi点最近的shot_feature 是 shot_feature[2][1][1][2]。
要进行下面4个插值。
- 对于格子内部weight落在2到3之间,分别给shot_feature[2][1][1][2] += 0.8 (1-(0.22*10-2)), shot_feature[2][1][1][3] += 0.2(1-(3-0.22*10))做权重加成。
- 对于X方向的分隔,需要给15号和14号格子相对应的特征shot_feature[2][1][1][2]+= 0.8 (1-(1-0.8)),shot_feature[2-1][1][1][2]+= 0,根据pi的x轴到格子中心的距离比值进行插值。
- 对于Y方向分隔,需要给15,6号格子做类似上述的加权,shot_feature[2][1][1][2]+= 0.7 (1-0.3),shot_feature[2][1-1][1][2]+= 0.3。
- 对于Z方向分隔,需要给15,12号格子做类似上述的加权, shot_feature[2][1][1][2]+= 0.6 (1-0.4),shot_feature[2][1][1+1][2]+= 0.4。
球模型插值
类比上述思路,将支撑区域换成球。
假设当前点q,法向nq与标架Z轴夹角cos值为0.33,坐标点为(0.2, 0.5, 0.1)
和球心距离dist=0.547722557
在经度划分中属于0区域
纬度划分中属于1区域
在半径划分中属于0区域
在weight数组中属于3号位置
则 shot_feature的位置为
shot_feature[0][1][0][3]
内部weight插值
先计算出cos值,找到对应的两个邻近的特征指标,利用距离进行权重插值
对应到点q操作如下:
shot_feature[0][1][0][3]+=0.7
shot_feature[0][1][0][4]+=0.3
半径插值
先利用cos值找到对应的特征指标
利用q点把半径分成两部分,利用两部分长度的比值对内外两上区域指标进行插值。
对应到点q操作如下:
shot_feature[0][1][0][3]+=1-dist/R
shot_feature[0][1][1][3]+=dist/R
纬度插值
先利用cos值找到对应的特征指标
利用q点与原点连线将z轴一侧半圆分成两部分,利用两部分面积的比值对上下两上区域指标进行插值。
对应到点q操作如下:
shot_feature[0][0][0][3]+=θ/π
shot_feature[0][1][0][3]+=1-θ/π
经度插值
q’为q点在XOY平面上的投影
通过投影点可以找到两个被经度分割的邻近块。
两条虚线为块的中心线,夹角为ω
θ是由q’ 与块内部中心线所形成的夹角。
通过θ分割ω的比例进行插值。
对应到点q操作如下:
shot_feature[0][1][0][3]+=1-θ/ω
shot_feature[1][1][0][3]+=θ/ω
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接,帮忙转发,感激不尽。