提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
声明:这是本人第一次在CSDN上写博客,使用还不熟悉,如有错误还请见谅。
前言
点云学习中一个很重要的概念,特征描述子。比较常用的就是PFH与FPFH,之前自己学习的时候为了弄清楚具体原理,也是各种查资料,但是针对 [ α , ϕ , θ ] [\alpha,\phi,\theta] [α,ϕ,θ],这三个的具体求法总是不明白,网上查的很多资料也并没有将具体的推导过程,所以今天将自己的理解写下来,希望对那些这方面也有疑惑的朋友能起到一点帮助。
原理示意图
PFH与FPFH二者之间的区别相信各位都已经了解,网上相关介绍非常之多,在此不再赘述。
上图中,我们一般默认
p
1
p_{1}
p1为源点建立局部坐标系。在此说明这个源点是如何确定的,具体思想是:法向量与两点连线的夹角较小的那个点为源点。注意
p
1
p_{1}
p1的法向量
n
1
n_{1}
n1,与
p
2
p_{2}
p2的法向量
n
2
n_{2}
n2,明显
n
1
n_{1}
n1与两点连线的夹角更小,故
p
1
p_{1}
p1为源点,先在此建立局部坐标系。(注:上述法向量均为单位法向量,即模值为1)
1、局部坐标系的建立
第一个轴:这个很容易确定,就是 p 1 p_{1} p1的法向量 n 1 n_{1} n1。
第二个轴:法向量 n 1 n_{1} n1, p 1 p 2 p_{1}p_{2} p1p2这条线会组成一个平面,以垂直这个平面的向量 v v v作为第二个轴。显然 v = ( p 2 − p 1 ) × u v=(\begin{matrix}p_2-p_1\end{matrix})\times u v=(p2−p1)×u。(叉乘应该就不需要解释了吧…)
第三个轴:上面两个轴再叉乘…。 w = u × v w=u\times v w=u×v
最后就是归一化,使得三个坐标轴向量长度均为1。
u
=
n
1
u=n_{1}
u=n1由于
n
1
n_{1}
n1本身就是单位向量,故
u
u
u不需要变化。
v
=
u
×
p
2
−
p
1
∥
p
2
−
p
1
∥
2
v=u\times\frac{p_{2}-p_{1}}{\|p_{2}-p_{1}\|_{2}}
v=u×∥p2−p1∥2p2−p1
p
1
p_{1}
p1,
p
2
p_{2}
p2之间的连线长度不确定,所以需要归一化,故需要除以二者之间的模长,即
∥
p
2
−
p
1
∥
2
\|p_2-p_1\|_2
∥p2−p1∥2。两个单位向量的叉乘还是单位向量,故
v
v
v的最终形式确定。
w
=
u
×
v
w=u\times v
w=u×v
引用上面的一句话:两个单位向量的叉乘还是单位向量,故
w
w
w的最终形式确定…
到此为止,上面图片中三个轴的建立就讲清楚了。
2、描述子三元素具体求法。
我这里说的三元素其实就是 [ α , ϕ , θ ] [\alpha,\phi,\theta] [α,ϕ,θ],其实还有一个元素 d d d,不过咱们一般都默认忽略了就。先解释一下: α \alpha α就是 p 2 p_{2} p2的法向量 n 2 n_{2} n2与坐标轴 v v v的夹角。 ϕ \phi ϕ就是 p 1 p_{1} p1的法向量 n 1 n_{1} n1与两个点连线之间的夹角。 θ \theta θ不好叙述,在此先不介绍,后面具体推到过程中各位就明白了。
推导 α \alpha α:
v
⋅
n
2
=
∣
v
∣
⋅
∣
n
2
∣
cos
α
v\cdot n_{2}=|v|\cdot|n_{2}|\cos\alpha
v⋅n2=∣v∣⋅∣n2∣cosα
向量的点乘公式,此时请注意
v
v
v与
n
2
n_{2}
n2均为单位向量,模长全为1,故上式可以写成:
v
⋅
n
2
=
cos
α
v\cdot n_{2}=\cos\alpha
v⋅n2=cosα
因为0-180°中,cos函数是单调的,所以此时咱们使用
cos
α
\cos\alpha
cosα,或者是
α
\alpha
α,都没什么影响,因为都是唯一确定的一个值。为了方便一般写作
α
\alpha
α。第一个公式推导完毕:
α
=
v
⋅
n
2
\alpha=v\cdot n_{2}
α=v⋅n2
推导 ϕ \phi ϕ:
原理其实和上面的相同,都是忽略了cos而已。故不在多余介绍。
推导 θ \theta θ
首先有必要介绍一些基础数学知识,先上图(实在懒得在电脑上画图了,直接手搓了一个,凑合能看…)。
解释一下:上面的向量
a
a
a,
b
b
b均为单位向量,二者之间夹角为
θ
\theta
θ(不好意思忘了区分了,这里的符号就是一个基础知识,不要和本文内容弄混),向量
a
a
a在向量
b
b
b的投影为向量
c
c
c。那么向量
c
c
c应该如何表示呢?我们开始推导:
a
⋅
b
=
∣
a
∣
∣
b
∣
⋅
cos
θ
=
cos
θ
\begin{aligned}a\cdot b&=|a||b|\cdot\cos\theta\\&=\cos\theta\end{aligned}
a⋅b=∣a∣∣b∣⋅cosθ=cosθ
注意向量
a
a
a,向量
b
b
b模长均为1。在这个直角三角形中:向量
c
c
c模长:
∣
c
∣
=
∣
a
∣
⋅
cos
θ
|c|=|a|\cdot\cos\theta
∣c∣=∣a∣⋅cosθ
把这里模长
a
a
a换成模长
b
b
b,因为都是单位向量嘛,换后也没影响。所以:
∣
c
∣
=
∣
b
∣
⋅
cos
θ
|c|=|b|\cdot\cos\theta
∣c∣=∣b∣⋅cosθ
再从向量的角度进行考虑,向量
c
c
c与向量
b
b
b共线,结合上式,故:
c
=
b
⋅
cos
θ
c=b\cdot\cos\theta
c=b⋅cosθ
向量
c
c
c表示为上,当然还可以再变形,几个公式来回代入就好。这里其实只需要用到向量
c
c
c的模长:
∣
c
∣
=
∣
b
∣
cos
θ
=
cos
θ
=
a
⋅
b
|c|=|b|\cos\theta=\cos\theta\\=a\cdot b
∣c∣=∣b∣cosθ=cosθ=a⋅b
这里记住公式:
∣
c
∣
=
a
⋅
b
|c|=a\cdot b
∣c∣=a⋅b。后面会用到。
ok,基础知识讲完,下面回归正题。
回到最上面的原理图,
p
2
p_{2}
p2点出,灰色的三个箭头就是投影到这里的坐标轴。此时咱们尽量不要被那个原理图所迷惑,图中给出的是直接法向量投影,个人觉得这样不好理解,看我下面讲的就好。咱们首先将这个点处的法向量
n
2
n_{2}
n2分别向
u
u
u和
w
w
w两个轴投影,投影点分别为n和m。投影的平面图如下所示:
我们可以根据两个点n、m和坐标轴,画出一个长方形,连接对角线
o
p
2
op_{2}
op2。对角线
o
p
2
op_{2}
op2与
u
u
u轴的夹角即为最上方原理图中的
θ
\theta
θ。此时咱们在三角形中求
θ
\theta
θ。
tan
θ
=
o
n
n
p
2
∴
θ
=
arctan
o
n
n
p
2
\begin{aligned}\tan\theta&=\frac{on}{np_{2}}\\\therefore\theta&=\arctan\frac{on}{np_{2}}\end{aligned}
tanθ∴θ=np2on=arctannp2on
此时还记得之前讲的基础知识里,最后我让咱们记住的那个公式吗:
∣
c
∣
=
a
⋅
b
|c|=a\cdot b
∣c∣=a⋅b
结合起来看:
∣
o
n
∣
=
u
⋅
n
2
|on|=u\cdot n_{2}
∣on∣=u⋅n2
∣
n
p
2
∣
=
w
⋅
n
2
|np_{2}|=w\cdot n_{2}
∣np2∣=w⋅n2
所以说最后
θ
\theta
θ的公式为:
θ
=
arctan
(
u
⋅
n
2
,
w
⋅
n
2
)
\theta=\arctan(u\cdot n_{2},w\cdot n_{2})
θ=arctan(u⋅n2,w⋅n2)
到此为止,咱们的问题就全部解决了吗?并没有!此时可能会有人问:公式顺序不对呀,我看好多教程是
θ
=
arctan
(
w
⋅
n
2
,
u
⋅
n
2
)
\theta=\arctan(w\cdot n_{2},u\cdot n_{2})
θ=arctan(w⋅n2,u⋅n2),你推导的怎么前后颠倒了,而且你推导的是除号,怎么最终公式中成逗号了?
关于这一点,说一下我的理解:
首先前后颠倒错了吗?并没有,各位注意下我画的图,包括各位在其他地方看到的所有原理图,
θ
\theta
θ全部是与
u
u
u轴的夹角,但是我们注意一下与
θ
\theta
θ互余的那个角,就是对角线与
w
w
w轴的夹角,这个夹角其实也可以看做是
θ
\theta
θ,这是两种不同的标准,只要全部统一,
θ
\theta
θ到底选择是和哪个轴的夹角其实无伤大雅,因为并不影响特征。其次就是说的逗号问题,个人理解就是因为考虑到这种情况,所以才写成逗号的,因为两种方式计算都可以。
放在最后
相信如果慢慢的读下来,绝对可以让你清晰理解这方面的推导。可能很多地方讲的不好,如果不足,还请指正!
标签:cos,p1,特征描述,cdot,PFH,FPFH,theta,n2,向量 From: https://blog.csdn.net/weixin_49166952/article/details/139621763