2 相机成像—观测方程
2.1 单目相机
以针孔相机为例,小孔成像的原理用数学表示可视为相似三角形。设
O
−
x
−
y
−
z
O-x-y-z
O−x−y−z 为相机坐标系,
O
O
O 为相机光心,空间一点
P
P
P 在相机坐标系下的坐标为
[
X
,
Y
,
Z
]
T
[X,Y,Z]^T
[X,Y,Z]T,点
P
P
P 对应的像
P
′
P^\prime
P′ 的坐标为
[
X
′
,
Y
′
,
Z
′
]
T
[X^\prime,Y^\prime,Z^\prime]^T
[X′,Y′,Z′]T,相机的焦距设为
f
f
f (光心到像的距离)则有
Z
f
=
X
X
′
=
Y
Y
′
\frac{Z}{f}=\frac{X}{X^\prime}=\frac{Y}{Y^\prime}
fZ=X′X=Y′Y(将像置于物的同一侧,即去掉坐标系下的负号)
整理得
X
′
=
f
X
Z
Y
′
=
f
Y
Z
(2.1.1)
\begin{aligned}X^\prime=f\frac{X}{Z}\\Y^\prime=f\frac{Y}{Z}\end{aligned}\tag{2.1.1}
X′=fZXY′=fZY(2.1.1)上述公式单位都为米(m)。在相机中,我们得到的照片都是像素(pixel)为单位,还需在成像平面上对像进行采样和量化(量化的最小单位为像素)。因此,设像素坐标系
o
−
u
−
v
o-u-v
o−u−v(二维)固定在成像的平面上,
o
o
o 点位于图像的左上角,
u
u
u 轴向右与
x
x
x 轴平行,
v
v
v 轴向下与
y
y
y 轴平行。像素坐标系和成像平面之间差了一个缩放和平移(成像原点一般位于图像的中心),设像素坐标在
u
u
u 轴上缩放了
α
\alpha
α 倍,在
v
v
v 轴上缩放了
β
\beta
β 倍,原点平移了
[
c
x
,
c
y
]
T
[c_x,c_y]^T
[cx,cy]T。则
P
′
P^\prime
P′ 点坐标与像素坐标
[
u
,
v
]
T
[u,v]^T
[u,v]T 的关系为
{
u
=
α
X
′
+
c
x
v
=
β
Y
′
+
c
y
\begin{cases}u=\alpha X^\prime+c_x\\v=\beta Y^\prime+c_y\end{cases}
{u=αX′+cxv=βY′+cy把式子(2.1.1)带入该式,令
α
f
=
f
x
\alpha f=f_x
αf=fx,
β
f
=
f
y
\beta f=f_y
βf=fy可得
{
u
=
f
x
X
Z
+
c
x
v
=
f
y
Y
Z
+
c
y
\begin{cases}u=f_x\frac{X}{Z} +c_x\\v=f_y\frac{Y}{Z}+c_y\end{cases}
{u=fxZX+cxv=fyZY+cy根据
f
f
f 单位为米,
α
\alpha
α,
β
\beta
β 单位为像素/米,因此
f
x
f_x
fx,
f
y
f_y
fy 和
c
x
c_x
cx,
c
y
c_y
cy 的单位为像素。上式通过齐次坐标改写为矩阵形式
[
u
v
1
]
=
1
Z
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
=
d
e
f
1
Z
K
P
(2.1.2)
\left[\begin{matrix}u\\v\\1\end{matrix}\right]=\frac{1}{Z}\left[\begin{matrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{matrix}\right]\left[\begin{matrix}X\\Y\\Z\end{matrix}\right]\overset{def}{=}\frac{1}{Z}KP\tag{2.1.2}
uv1
=Z1
fx000fy0cxcy1
XYZ
=defZ1KP(2.1.2)或者
Z
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
=
d
e
f
K
P
(2.1.3)
Z\left[\begin{matrix}u\\v\\1\end{matrix}\right]=\left[\begin{matrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{matrix}\right]\left[\begin{matrix}X\\Y\\Z\end{matrix}\right]\overset{def}{=}KP\tag{2.1.3}
Z
uv1
=
fx000fy0cxcy1
XYZ
=defKP(2.1.3)称矩阵
K
K
K 为相机内参(Camera Intrinsics)矩阵。通常认为,相机在出厂之后的内参就是固定的,有时厂商会告诉内参,有时需要通过标定来确认内参。有内参,就有相对的外参。在式子(2.1.2)中的
P
P
P 是在相机坐标系下的坐标 (
P
c
P_c
Pc),用世界坐标表示,点
P
P
P 的在相机坐标下的坐标为
P
(
P
c
)
=
T
P
w
=
R
P
w
+
t
P(P_c)=TP_w=RP_w+t
P(Pc)=TPw=RPw+t,那么有
Z
P
u
v
=
Z
[
u
v
1
]
=
K
(
R
P
w
+
t
)
=
K
T
P
w
(2.1.4)
ZP_{uv}=Z\left[\begin{matrix}u\\v\\1\end{matrix}\right]=K(RP_w+t)=KTP_w\tag{2.1.4}
ZPuv=Z
uv1
=K(RPw+t)=KTPw(2.1.4)该式描述了点
P
P
P 的世界坐标
P
w
P_w
Pw 到像素坐标
P
u
v
P_{uv}
Puv 的投影关系,其中相机的位姿
R
R
R,
t
t
t 又称为相机的外参数(Camera Extrinsics),外参会随着相机运动而改变,也就是SLAM中待估计的目标,表示机器人的运动轨迹。
对式子(2.1.4)逆着考虑可得出:可通过世界坐标系下坐标
P
w
P_w
Pw 转化成相机坐标
P
P
P,对
P
P
P 进行深度归一化处理可得在相机平面上的归一化坐标
P
′
P^\prime
P′(归一化坐标可以看成相机前方
z
=
1
z=1
z=1 的平面上的坐标,
z
=
1
z=1
z=1 的平面也称归一化平面),然后再对
P
′
P^\prime
P′ 左乘相机内参矩阵,可得像素坐标
P
u
v
P_{uv}
Puv。 像素坐标可以视为归一化坐标,但是不是归一平面上的坐标,两者相差一个内参矩阵。
R
P
w
+
t
⟶
P
=
[
X
,
Y
,
Z
]
T
⟶
P
′
=
[
X
/
Z
,
Y
/
Z
,
1
]
T
⟶
P
u
v
=
[
u
,
v
,
1
]
T
(2.1.5)
RP_w+t\longrightarrow P=[X,Y,Z]^T\longrightarrow P^\prime=[X/Z,Y/Z,1]^T\longrightarrow P_{uv}=[u,v,1]^T\tag{2.1.5}
RPw+t⟶P=[X,Y,Z]T⟶P′=[X/Z,Y/Z,1]T⟶Puv=[u,v,1]T(2.1.5)注意到,
P
P
P 坐标中的深度在投影中被丢失了,所以单目相机无法得到像的深度值。
2.2 畸变问题
由于相机安装了的透镜,可能是因为透镜对光线传播的影响,而出现的畸变(Distortion,也成为失真)问题,称为径向畸变(Radial Distortion),又或者是因为在组装时,透镜与成像平面没有完全平行,而出现的畸变问题为切向畸变(Tangential Distortion)。对于归一化平面上的任意一点 p = [ x , y ] T = [ r , θ ] T p=[x,y]^T=[r,\theta]^T p=[x,y]T=[r,θ]T,其中 r r r 为点 p p p 与坐标系原点之间的距离, θ \theta θ 表示与水平轴的夹角(极坐标形式)。径向畸变可以看成坐标点沿着长度方向(距离原点的长度)发生了变化,切向畸变可以看成坐标点沿着切向方向(水平夹角)发生了变化。假设畸变呈多项式关系,即对径向畸变来说 x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)\\y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6) xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)其中, [ x d i s t o r t e d , y d i s t o r t e d ] T [x_{distorted},y_{distorted}]^T [xdistorted,ydistorted]T 表示发生畸变点的归一化坐标。 对于切向畸变,可以使用 参数 p 1 p_1 p1, p 2 p_2 p2 进行纠正: x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y x_{distorted}=x+2p_1xy+p_2(r^2+2x^2)\\y_{distorted}=y+p_1(r^2+2y^2)+2p_2xy xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy整合上述两个公式 { x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y (2.2.1) \begin{cases}x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2)\\y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy\end{cases}\tag{2.2.1} {xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy(2.2.1)
切向畸变通过工艺手段可以忽略,只需要考虑径向畸变。 x d i s t o r t e d x_{distorted} xdistorted 角标已表明为发生畸变的坐标。通常来讲, x y x y xy为发生畸变之前的,也就是我们想要的,为未知变量,而 x d i s t o r t e d x_{distorted} xdistorted为发生了畸变的,为已知变量。按照常规想法对于式子(2.2.1)来说,根据已知求未知是较为麻烦的逆运算。但是我们假设得到 x y xy xy坐标的点,代入公式,得出发生畸变的图像,将 x d i s t o r t e d x_{distorted} xdistorted的坐标替换掉 x y xy xy坐标。不过到的 x d i s t o r t e d x_{distorted} xdistorted可能不是整数,需要插值计算。
将畸变之后的点通过内参矩阵投影到像素平面 { u = f x x d i s t o r t e d + c x v = f y y d i s t o r t e d + c y (2.2.2) \begin{cases}u=f_xx_{distorted}+c_x\\v=f_yy_{distorted}+c_y\end{cases}\tag{2.2.2} {u=fxxdistorted+cxv=fyydistorted+cy(2.2.2)因此在式子(2.1.5)中插入式子(2.2.1)(2.2.2)则有 P ′ = [ X / Z , Y / Z , 1 ] T ⟶ P d i s t o r t e d ′ = [ x d i s t o r t e d , y d i s t o r t e d , 1 ] T ⟶ ( 2.2.2 ) P u v = [ u , v , 1 ] T ) (2.2.3) P^\prime=[X/Z,Y/Z,1]^T\longrightarrow P^\prime_{distorted}=[x_{distorted},y_{distorted},1]^T\overset{(2.2.2)}{\longrightarrow} P_{uv}=[u,v,1]^T)\tag{2.2.3} P′=[X/Z,Y/Z,1]T⟶Pdistorted′=[xdistorted,ydistorted,1]T⟶(2.2.2)Puv=[u,v,1]T)(2.2.3)
2.3 双目相机
由于单目相机无法根据一个像素测量物体深度,因此提出双目相机。双目相机测量深度的原理类似与人的双眼,是通过左右眼的间距(视差)来判断物体与我们的距离。
双目相机都是水平放置在同一横轴上,两者光心的距离为基线(Baseline),记作
b
b
b。考虑空间点
P
P
P,左右眼相机各成一像,记作
P
L
P_L
PL 和
P
R
P_R
PR。由于基线
b
b
b 的存在,两个像的位置不同。理想情况下,左右相机只在
x
x
x 轴上有位移,对应图像上的
u
u
u 轴,记左侧坐标为
u
L
u_L
uL,右侧坐标为
u
R
u_R
uR,如图所示,由相似关系得
z
−
f
z
=
b
−
u
L
+
u
R
b
\frac{z-f}{z}=\frac{b-u_L+u_R}{b}
zz−f=bb−uL+uR整理得
z
=
f
b
d
d
=
d
e
f
u
L
−
u
R
(2.3.1)
z=\frac{fb}{d}~~~~~d\overset{def}{=}u_L-u_R\tag{2.3.1}
z=dfb d=defuL−uR(2.3.1)其中
d
d
d 定义为左右图的横坐标(左右横坐标均为整数)之差,称为视差(disparity)。由上式可知,视差
d
d
d 与物体深度
z
z
z 成反比,
d
d
d 越小,
z
z
z 越大。同时,视差最小为一个像素,因此深度存在一个理论上的最大值,由
f
b
fb
fb 确定。基线
b
b
b 越长,看到的距离越远。
虽然双目成像的原理很简单,但是对于计算机来说,视差
d
d
d 的计算却比较困难。我们需要确切地知道左眼图像的某个像素出现在右眼图像的哪个位置(即对应关系),当我们想计算每个像素的深度时,其计算量与精度都是一个很大的问题,而且只有在图像纹理变化丰富的地方才能计算视差。
齐次坐标
参考 https://zhuanlan.zhihu.com/p/258437902
欧式空间中,两条平行直线不可能相交。但在投影空间中,两条平行直线可以相交于无穷远点(如火车铁轨在无穷远处相交—投影)。 一个2D点在笛卡尔坐标系中表示为
(
x
,
y
)
(x,y)
(x,y),欧式空间无法表示相交于无穷远点。
齐次坐标是用N+1个维度来表示N维坐标。
(
x
,
y
)
(x,y)
(x,y) 有相应的齐次坐标
(
x
,
y
,
w
)
(x,y,w)
(x,y,w),其中
w
w
w 为额外变量。
两个坐标相互转化
(
x
,
y
,
w
)
Homogeneous
⇔
(
x
w
,
y
w
)
Cartesian
\begin{array}{c} (x, y, w) \\ \text { Homogeneous } \end{array} \Leftrightarrow \begin{array}{c} (\frac{x}{w}, \frac{y}{w}) \\ \text { Cartesian } \end{array}
(x,y,w) Homogeneous ⇔(wx,wy) Cartesian
如
Homogeneous
Cartesian
(
1
,
2
,
3
)
⇒
(
1
3
,
2
3
)
(
2
,
4
,
6
)
⇒
(
2
6
,
4
6
)
=
(
1
3
,
2
3
)
⋮
⋮
(
1
a
,
2
a
,
3
a
)
⇒
(
1
a
3
a
,
2
a
3
a
)
=
(
1
3
,
2
3
)
\begin{array}{l} \text{Homogeneous} &\! &\text{Cartesian} \\ (1,2,3) &\Rightarrow &\left(\frac{1}{3}, \frac{2}{3}\right) \\ (2,4,6) &\Rightarrow&\left(\frac{2}{6}, \frac{4}{6}\right)=\left(\frac{1}{3}, \frac{2}{3}\right) \\ \vdots &\quad &\vdots \\ (1 a, 2 a, 3 a) &\Rightarrow&\left(\frac{1 a}{3 a}, \frac{2 a}{3 a}\right)=\left(\frac{1}{3}, \frac{2}{3}\right) \\ \end{array}
Homogeneous(1,2,3)(2,4,6)⋮(1a,2a,3a)⇒⇒⇒Cartesian(31,32)(62,64)=(31,32)⋮(3a1a,3a2a)=(31,32)
可以看出
(
1
,
2
,
3
)
(1,2,3)
(1,2,3) 和
(
2
,
4
,
6
)
(2,4,6)
(2,4,6) 对应于同一欧式点
(
1
/
3
,
2
/
3
)
(1/3, 2/3)
(1/3,2/3)。因此这些点都是齐次(Homogeneous)的,视为在欧式空间中代表同一点。
数学证明
欧式空间的线性系统
{
A
x
+
B
y
+
C
=
0
A
x
+
B
y
+
D
=
0
\begin{cases} Ax+By+C=0 \\ Ax+By+D=0 \end{cases}
{Ax+By+C=0Ax+By+D=0
因为
C
≠
D
C \neq D
C=D(两条直线不重叠),方程无解。
改为投影空间方程,将
x
x
x 、
y
y
y 替换为
x
w
\frac{x}{w}
wx 、
y
w
\frac{y}{w}
wy。
{
A
x
w
+
B
y
w
+
C
=
0
A
x
w
+
B
y
w
+
D
=
0
⇒
{
A
x
+
B
y
+
C
w
=
0
A
x
+
B
y
+
D
w
=
0
\begin{cases} A\frac{x}{w}+B\frac{y}{w}+C=0 \\ A\frac{x}{w}+B\frac{y}{w}+D=0 \end{cases} \Rightarrow \begin{cases} Ax+By+Cw=0 \\ Ax+By+Dw=0 \end{cases}
{Awx+Bwy+C=0Awx+Bwy+D=0⇒{Ax+By+Cw=0Ax+By+Dw=0
两个方程相减,
(
C
−
D
)
w
=
0
(C-D)w=0
(C−D)w=0 ,则
w
=
0
w=0
w=0。因此两条直线在
(
x
,
y
,
0
)
(x,y,0)
(x,y,0) 处相交。
齐次坐标通过增加一个额外的维度,来对几何体进行缩放、旋转、平移和透视投影等矩阵变换。
任何N维的齐次坐标,只要
w
≠
0
w\neq 0
w=0 ,都可以转换为
w
=
1
w = 1
w=1 的向量,然后获得其N-1维欧式空间的点值。而当
w
=
0
w=0
w=0 ,该坐标表示无限长的向量,为N-1维的矢量。
欧式几何是投影几何的子集,如 ( a , b ) ∈ ( a , b , 1 ) (a,b)\in (a,b,1) (a,b)∈(a,b,1)。