参考:计算机视觉中的多视图几何、中科院模重所-视觉基础介绍
视觉SLAM中常用的射影变换有:2D欧式变换(如,平面内运动的机器人)、2D仿射变换(SVO中用来恢复图像块用的)、2D射影变换(我们平常说的单应矩阵就是它,对它分解可得到R
和t
)、3D欧式变换(SLAM中主要解决的问题之一,估计相机的3维运动)、3D相似变换(单目SLAM中会遇到,由尺度漂移造成)等
1、2D射影几何
照相机的成像过程不保持欧氏性质,例如:平行线不再平行,如下图所示
世界坐标系(景物平面)下两条平行的车道线,在相机拍出的图片中居然交于了一点,我们称这种现象为射影失真,这种现象非常常见,如,原来窗子是矩形的,可能你拍出的图片却是梯形的。那我们怎么还原图像呢,这就是射影变换要解决的问题,在此之前我们先要了解射影几何是什么玩意.
1.1 点和线的齐次坐标表示
假设有一条直线:
a
x
+
b
y
+
c
=
0
ax+by+c=0
ax+by+c=0,那么直线可以用一矢量表示,即它的齐次坐标是
l
=
(
a
,
b
,
c
)
T
\boldsymbol l = (a, b, c)^T
l=(a,b,c)T,点的齐次坐标是
x
=
(
x
,
y
,
1
)
T
\boldsymbol x = (x, y, 1)^T
x=(x,y,1)T.
- 结论1: 点在直线上的充要条件是二者内积为0: x T l = 0 \boldsymbol x^T \boldsymbol l=0 xTl=0.
- 结论2: 两直线 l \boldsymbol l l 和 l ′ \boldsymbol l' l′ 的交点是二者的外积: x = l × l ′ \boldsymbol x = \boldsymbol l \times \boldsymbol l' x=l×l′.
- 结论3: 过两点 x \boldsymbol x x 和 x ′ \boldsymbol x' x′ 和直线是: l = x × x ′ \boldsymbol l = \boldsymbol x \times \boldsymbol x' l=x×x′.
1.2 无穷远点
虽然齐次坐标
(
x
,
y
,
1
)
(x, y, 1)
(x,y,1) 与非齐次坐标
(
x
,
y
)
(x, y)
(x,y) 表示相同的点,但没有对应于三元坐标
(
x
,
y
,
0
)
(x, y, 0)
(x,y,0) 的非齐次点,如果我们试着用最后一个坐标来划分,我们得到了无穷的点
(
x
/
0
,
y
/
0
)
(x/0, y/0)
(x/0,y/0),即
(
∞
,
∞
)
(\infty, \infty)
(∞,∞),无穷远点就是这样产生的!它们是齐次坐标最后那个坐标为零的点.
如下图所示,世界坐标系下车道线应该是左图这样(想象你拿着相机飞到空中俯拍一张马路的图片),然而我们拍出来的车道线是右图这样的(你站在马路中央拍摄的),对于第一幅图,这两条平行的车道线分别为
l
=
(
a
,
b
,
c
)
T
\boldsymbol l=(a, b, c)^T
l=(a,b,c)T 和
l
′
=
(
a
,
b
,
c
′
)
T
\boldsymbol l'=(a, b, c')^T
l′=(a,b,c′)T,其中它们的前两个坐标是一样的,使用上面的结论2得到两直线的交点为
l
×
l
′
=
(
c
′
−
c
)
(
b
,
−
a
,
0
)
T
\boldsymbol l \times \boldsymbol l' = (c'-c)(b, -a, 0)^T
l×l′=(c′−c)(b,−a,0)T,忽略标量因子
(
c
′
−
c
)
(c'-c)
(c′−c),得到点
(
b
,
−
a
,
0
)
T
(b, -a, 0)^T
(b,−a,0)T,如果转换到非齐次坐标系下,毫无疑问我们得到的是无穷远点,对于第二幅图,车道线的交点我们设为
(
a
1
,
b
1
)
(a_1, b_1)
(a1,b1),那么它对应的齐次坐标将是
(
a
1
,
b
1
,
1
)
(a_1, b_1, 1)
(a1,b1,1),图一中的无穷远点会映射到图二中的有限点,这种现象叫做消影点,只有射影变换有这种特性,仿射变换相似变换都不具备. 究竟这两幅图之间是经过怎样的位姿变换才能变成这样的呢,这就是射影变换要做的事情了!
1.3 射影空间
齐次矢量
(
x
1
,
x
2
,
x
3
)
T
(x_1,x_2,x_3)^T
(x1,x2,x3)T 对应于
I
R
2
IR^2
IR2 (二维平面空间)中的有限点,现在将最后一维
x
3
=
0
x_3=0
x3=0 的点加入
I
R
2
IR^2
IR2 空间,那么所扩展区间的所有齐次3维矢量的集合,称为射影空间
I
P
2
IP^2
IP2.
1.4 无穷远线
我们已经知道
I
R
2
IR^2
IR2 空间的平行线交于一个无穷远点,这个无穷远点在射影空间是齐次坐标最后那个坐标为零的点.
所有理想点集合在一条直线上,称无穷远线,用
I
∞
=
(
0
,
0
,
1
)
T
I_∞=(0,0,1)^T
I∞=(0,0,1)T 表示. 因为
I
∞
I_∞
I∞ 与任何一条直线
l
=
(
a
,
b
,
c
)
T
\boldsymbol l = (a, b, c)^T
l=(a,b,c)T相交与理想点
(
b
,
−
a
,
0
)
T
(b, -a, 0)^T
(b,−a,0)T,所以无穷远线可以看成平面内
所有直线方向
的集合.
所以,射影空间不存在平行线,平行线无意义(因为即使实在原非齐次坐标系下平行的线在齐次坐标系下也会相交于一点,所以两条线都相交了,还能叫做平行吗,所以射影空间不存在平行线),因为任何两条相异直线必然交于一点.
1.5 归一化坐标
slambook中提到的归一化坐标(P87),其实它是2维的齐次坐标,只不过最后一维是1
,如果去掉最后一维的1
得到的就是非齐次坐标.
2、射影变换
射影变换别名有:射影映射、保线变换(Collineation)、单应变换(Homography)、中心射影变换等
类似特殊正交群(SO3)、特殊欧式群(SE3),射影变换也组成了一个群.
映射 h h h : I P 2 → I P 2 IP^2\rightarrow IP^2 IP2→IP2 是射影映射的充要条件是:存在一个3X3非奇异矩阵H,使得 I P 2 IP^2 IP2 的任何一个用矢量 x \boldsymbol x x 表示的点都满足 h ( x ) = H x h(\boldsymbol x)=H \boldsymbol x h(x)=Hx.
平面射影变换
是关于齐次 3 维矢量
的一种线性变换,并可用一个非奇异 3x3
矩阵H
表示为
(
x
1
′
x
2
′
x
3
′
)
=
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
(
x
1
x
2
x
3
)
\begin{pmatrix} x_{1}'\\ x_{2}'\\ x_3' \end{pmatrix}=\begin{bmatrix} h_{11} & h_{12} & h_{13}\\ h_{21}& h_{22} & h_{23}\\ h_{31}& h_{32} & h_{33} \end{bmatrix}\begin{pmatrix} x_{1}\\ x_{2}\\ x_{3} \end{pmatrix}
x1′x2′x3′
=
h11h21h31h12h22h32h13h23h33
x1x2x3
更简洁地表示为
x
′
=
H
x
\boldsymbol x′=H \boldsymbol x
x′=Hx.
注意,上面方程中的矩阵H
乘以任意非零比例因子不会使射影变换改变,就是说H
是一个齐次矩阵,它只有8个DOF.
3、消除射影失真
如下图所示,左图中平面
(墙面)的中心投影的图像与原平面
通过射影变换相关,因而左图是原景物的一种射影失真,通过求该射影变换的逆变换并把它应用于图像就可以撤销此射影变换了.
因为H
具备8个DOF,因此使用4点法求解即可.
注意,因为地面和大楼的前墙不在同一个平面上,所以用于矫正大楼前墙的射影变换必然与用于地面的射影变换不一样. 有没有一种射影变换能同时矫正二者? 有,3D射影变换!
4、变换的层次
4.1 2D欧式变换
又叫等距变换,是平面
I
R
2
IR^2
IR2 的变换
不变量:欧式距离不变,推导一下也很简单,就是变换前有平面上的两点(还是想象你飞在空中俯视大地) ,分别为
x
1
\boldsymbol x_1
x1 和
x
2
\boldsymbol x_2
x2,平面上的点都经过了相同的位姿变换,所以有,
x
1
′
=
R
x
1
+
t
\boldsymbol x_1'=R \boldsymbol x_1+t
x1′=Rx1+t,
x
2
′
=
R
x
2
+
t
\boldsymbol x_2'=R \boldsymbol x_2+t
x2′=Rx2+t,两式相减,取模即相等.
平面欧式变换有三个自由度,一个旋转、两个平移
4.2 相似变换
又叫等形变换,不变量是长度或者面积的比率
x
′
=
H
A
x
=
[
s
R
t
0
T
1
]
x
\boldsymbol x'=H_Ax=\begin{bmatrix} s \boldsymbol R& \boldsymbol t\\ \boldsymbol 0^T &1 \end{bmatrix}\boldsymbol x
x′=HAx=[sR0Tt1]x
为了与下面的仿射变换形成对比,这里可以将
s
R
sR
sR 分开,这样很容易比较二者的差别在哪里了.
s
R
=
R
[
s
0
0
s
]
s \boldsymbol R=\boldsymbol R \begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix}
sR=R[s00s]
注意,相似变换的缩放因子在两个轴上是相同的.
4.3 仿射变换
仿射变换是一个非奇异线性变换与一个平移变换的复合,具备6个自由度,因此可以使用三组点对应来计算.
x
′
=
H
A
x
=
[
A
t
0
T
1
]
x
\boldsymbol x'=H_Ax=\begin{bmatrix} \boldsymbol A& \boldsymbol t\\ \boldsymbol 0^T &1 \end{bmatrix}\boldsymbol x
x′=HAx=[A0Tt1]x
为了更好地理解仿射变换,一般将
A
\boldsymbol A
A 看作两个基本变换:旋转和非均匀缩放的复合
A
=
U
D
V
T
=
(
U
V
T
)
(
V
D
V
T
)
=
R
(
θ
)
R
(
−
ϕ
)
D
R
(
ϕ
)
\boldsymbol A=UDV^T=(UV^T)(VDV^T)=R(\theta)R(-\phi)DR(\phi)
A=UDVT=(UVT)(VDVT)=R(θ)R(−ϕ)DR(ϕ)
其中
R
(
θ
)
R(\theta)
R(θ) 和
R
(
ϕ
)
R(\phi)
R(ϕ) 分别表示转角为
θ
\theta
θ 和
ϕ
\phi
ϕ 和旋转,
D
D
D 为对角矩阵:
D
=
[
λ
1
0
0
λ
2
]
D=\begin{bmatrix} \lambda_1 &0\\ 0& \lambda_2 \end{bmatrix}
D=[λ100λ2]
4.4 下面是这几种平面变换的几何不变性质