NARF: 3D Range Image Features for Object Recognition
NARF 全称 normal aligned radial feature(法线对齐的径向特征) 。是一种3D特征点检测和描述算法。下面将分别详述 NARF 特征点的提取和描述。
NARF特征点提取
NARF说了很多其实就是考虑以下两点:
- 考虑表面稳定性
- 考虑物体边缘处
由以上的两个参考,NARF可以有如下特点: - 提取出边缘点,这些点往往更加具有稳定性和可重复性
- 提取出Normal稳定的,也就是一些平面相对光滑平面和共面的点
- 所有操作都是基于2D的range image,计算量相比于直接操作点云要小
边缘点提取
步骤:
1. 使用启发式方法寻找不跨越边缘的相邻点的典型3D距离
- 对每个深度图中的点p_i,创建窗口(核)边长为s,记住窗口内的领域点
N
p
i
=
n
1
,
n
2
,
?
?
,
n
s
2
N_{p_i}={n_1,n_2,\cdots,n_{s^2}}
Npi??=n1?,n2?,?,ns2?
- 计算p与他领域点的距离
D
p
i
=
d
0
,
d
1
,
?
?
,
d
s
2
,
D_{p_i}={d_0,d_1,\cdots,d_{s^2}},
Dpi??=d0?,d1?,?,ds2?,然后对他们进行升序排列,
D
p
i
′
=
d
0
′
,
d
1
′
,
?
?
,
d
s
2
′
D_{p_i}'={d_0',d_1',\cdots,d_{s^2}'}
Dpi?′?=d0′?,d1′?,?,ds2′?
- 假设在
p
i
p_i
pi?领域内,有n个点处于同一空间,那么选取
δ
=
d
M
′
\delta=d_M'
δ=dM′?作为跳变距离,M可以如下:
M
=
(
s
+
1
2
)
2
M=(\frac {s+1}{2})^2
M=(2s+1?)2,M也可以选取
d
i
‘
d_i‘
di?‘的点作为M
2. 使用 (1) 得到的距离信息,计算该点是边缘点的可信度(score)
- 距离可信度需要从上下左右四个方向一一判断,我们这里只是考虑右边的情况,实际上其他方向也是一样的,没啥可多说的。
- 计算平均距离点,这个点的采集数量自己定,文中采用
m
p
=
3
m_p=3
mp?=3
p
r
i
g
h
t
=
1
m
p
∑
i
=
1
m
p
p
x
+
i
,
y
p_{right}= \frac{1}{m_p} \sum_{i=1}^{m_p} p_{x+i,y}
pright?=mp?1?i=1∑mp??px+i,y? - 计算当前与平均距离点的距离
d
r
i
g
h
t
=
∣
∣
p
x
,
y
?
p
r
i
g
h
t
∣
∣
d_{right}=||p_{x,y}-p_{right}||
dright?=∣∣px,y??pright?∣∣ - 计算可信度
KaTeX parse error: Expected '}', got 'EOF' at end of input: …lta}{d_{right}) 那么
s
r
i
g
h
t
s_{right}
sright?越大,那么这个点就越可能是边缘点
3. 如果是边缘点,将该点分为上述3类点中的一类
- 确定
p
x
,
y
p_{x,y}
px,y?所属的类型,比较
p
x
.
y
p_{x.y}
px.y?和
p
r
i
g
h
t
p_{right}
pright?,如果
p
x
,
y
p_{x,y}
px,y?小,表示可能是obstacle border,反之,就可能是 shadow border。当然上下左右的各种点都要考虑
- 对所有可能是obstacle border的点,在2d平面右侧
m
p
m_p
mp?范围内,找到3d距离最大的点作为对应的shadow border,发然后计算
s
s
h
a
d
o
w
s_{shadow}
sshadow?(这个还是面向右侧的算法,
m
p
m_p
mp?可以前面定下来的点,可以自己定下来)。最后对上面的
s
r
i
g
h
t
做
如
下
更
新
s_{right}做如下更新
sright?做如下更新
s
r
i
g
h
t
′
=
m
a
x
(
0.9
,
1
?
(
1
?
s
s
h
a
d
o
w
)
3
)
×
s
r
i
g
h
t
s_{right}'=max(0.9,1-(1-s_{shadow})^3) \times s_{right}
sright′?=max(0.9,1?(1?sshadow?)3)×sright?
4. 非极大抑制以获得精确的边缘点位置
现在我们有了可信度
s
r
i
g
h
t
′
s_{right}'
sright′?,也有了范围s,那么我们就可以NMS来排除一些点了,先删除可信度在0.8以下的点,这个论文阈值定的就是这个,然后降序排序,从上到下,并交iou范围内的一些点删除,一一个都来下,详细请看NMS算法。最后对于每个选取到的点在
(
p
x
?
1
,
y
,
p
x
+
1
,
y
)
(p_{x-1,y},p_{x+1,y})
(px?1,y?,px+1,y?)范围内进行获取极大值,然后认为这个点才是对应的obstacle bordrer
边缘点小结
通过以上内容,我们就可以获取边缘点了,下面需要根据以上的边缘点信息,来提取真正的关键点。
关键点提取
关键点必须考虑以下内容:
- 必须考虑边缘和表面结构信息
- 必须是能在不同视角下都能被检测到的点
- 必须位于稳定的区域,从而可以得到的稳定的法向量
- 这里需要微分几何的相关知识,这里不做详细解释,但PCA方法比较容易我们大致介绍下:
- 设m条n维的数据
- 将原始数据按列组成n行m列的矩阵X;
- 将X的每一行进行去均值化,
- 取出协方差矩阵
C
=
1
m
X
X
T
C= \frac{1}{m} X X^T
C=m1?XXT
- 求出协方差矩阵的特征值及对应的特征向量
- 将特征向量按对应的特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
- Y=PX就是降维到k维后的数据
-
估计法向量:对每一个点
p
i
∈
R
a
n
g
e
I
m
a
g
e
p_i \in RangeImage
pi?∈RangeImage ,在2D的
2
δ
2\delta
2δ范围内的点,计算他们的3D位置,然后估计他们的法向量,以及对应的相关幅度。 -
对 range image 中的每一个点,计算一个表示其邻域表面变化的分数和这种变化的一个主方向(dominant direction)
- 计算主方向v和幅值
λ
\lambda
λ, 对于borders point,v为边缘方向,对一其他点,v
为主曲率方向,
λ
\lambda
λ为对应的幅值。(我觉得应该就是上面对应的法向量和对应的特征值) - 对于每个v,都有一个权值
w
∈
[
0
,
1
)
w \in [0,1)
w∈[0,1), 对borders point,
w
=
1
w=1
w=1;对others point,
w
=
1
?
(
1
?
λ
)
3
w=1-(1-\lambda)^3
w=1?(1?λ)3
- 指定没一个参数
σ
\sigma
σ,对于图像中的每个点p,找到其所有的欧式距离在
σ
2
\frac{\sigma}{2}
2σ?内且中间不存在边缘(两点位于同一个平面的点)
- 对于任意
p
i
p_i
pi?属于
N
p
i
N_{p_i}
Npi??,将
v
p
i
v_{p_i}
vpi??投影到一个平面P上(P为垂直于p到原点连线的一个平面),得到一个角度{
α
p
1
\alpha_{p_1}
αp1??}(
v
p
1
v_{p_1}
vp1??与平面的夹角?) 。对
α
p
i
\alpha_{p_i}
αpi??做如下调整:
α
′
=
{
2
×
(
α
?
180
)
f
o
r
???
α
>
90
2
×
(
α
?
180
)
f
o
r
???
α
>
90
}
\alpha'=\left\{ \begin{aligned} 2\times (\alpha-180) & for \ \ \ \alpha>90\\ 2\times (\alpha-180) & for \ \ \ \alpha>90 \end{aligned} \right\}
α′={2×(α?180)2×(α?180)?for???α>90for???α>90?} -
现在我们得到两幅图,长宽等于原来的图片,值分别是
w
和
α
w和\alpha
w和α -
计算置信度
I
1
(
p
)
=
min
?
i
(
1
?
w
p
i
×
m
a
x
(
1
?
10
×
∣
∣
p
?
p
i
∣
∣
σ
,
0
)
)
I_1(p)=\min \limits_{i} (1-w_{p_i} \times max(1- \frac {10\times ||p-p_i||}{\sigma},0))
I1?(p)=imin?(1?wpi??×max(1?σ10×∣∣p?pi?∣∣?,0))
f
(
p
i
)
=
w
p
i
×
(
1
?
∣
2
×
∣
∣
p
?
p
i
∣
∣
σ
?
1
2
∣
f(p_i)=\sqrt{w_{p_i} \times (1-|\frac{2 \times ||p-p_i||}{\sigma}-\frac{1}{2}|}
f(pi?)=wpi??×(1?∣σ2×∣∣p?pi?∣∣??21?∣
?
I
2
(
p
)
=
max
?
i
,
j
(
f
(
n
i
)
f
(
n
j
)
(
1
?
∣
c
o
s
(
α
n
i
′
?
α
n
j
′
∣
)
)
I_2(p)=\max \limits_{i,j} (f(n_i) f(n_j)(1-|cos(\alpha'_{n_i}-\alpha'_{n_j}|))
I2?(p)=i,jmax?(f(ni?)f(nj?)(1?∣cos(αni?′??αnj?′?∣))
I
(
p
)
=
I
1
(
p
)
I
2
(
p
)
I(p)=I_1(p) I_2(p)
I(p)=I1?(p)I2?(p) 其中第三个公式中的i和j,只是p点领域内的点两两匹配。
NARF描述子计算
|