此处省略vcs/world/camera/image坐标系的定义介绍了哈
世界坐标系到相机坐标系
3维到3维可逆
[ x c y c z c 1 ] = [ R 3 × 3 t 3 × 1 0 1 × 3 1 ] [ x w y w z w = 0 1 ] (1) \begin{bmatrix} x_{c}\\ y_{c}\\ z_{c}\\ 1 \end{bmatrix}= \begin{bmatrix} R_{3\times3}&t_{3\times1}\\ 0_{1\times3}&1 \end{bmatrix} \begin{bmatrix} x_{w}\\ y_{w}\\ z_{w}=0\\ 1 \end{bmatrix}\tag{1} xcyczc1 =[R3×301×3t3×11] xwywzw=01 (1)
其中 R 3 × 3 R_{3\times3} R3×3为旋转矩阵, t t t为平移向量,它们组成外参矩阵;
Q:为什么右边世界坐标系下向量要多设一行1;
A:在齐次坐标系下使用4个分量来描述三维坐标变换,使得变换矩阵形式更加紧凑,不然就得将矩阵拆开写成加法形式
假设在笛卡尔坐标系下有点
P
(
p
x
,
p
y
,
p
z
)
P(p_{x},p_{y},p_{z})
P(px,py,pz),平移向量为
t
(
t
x
,
t
y
,
t
z
)
t(t_{x},t_{y},t_{z})
t(tx,ty,tz),无法找到一个矩阵
M
M
M使得
M
×
P
=
P
+
t
=
[
p
x
+
t
x
p
y
+
t
y
p
z
+
t
z
]
M\times P=P+t= \begin{bmatrix} p_{x}+t_{x}\\ p_{y}+t_{y}\\ p_{z}+t_{z} \end{bmatrix}
M×P=P+t=
px+txpy+typz+tz
但是对于齐次坐标系中的点
P
(
p
x
,
p
y
,
p
z
,
1
)
P(p_{x},p_{y},p_{z},1)
P(px,py,pz,1),可以找到一个向量
M
M
M使得
M
×
P
=
P
+
t
=
[
p
x
+
t
x
p
y
+
t
y
p
z
+
t
z
1
]
M\times P=P+t= \begin{bmatrix} p_{x}+t_{x}\\ p_{y}+t_{y}\\ p_{z}+t_{z}\\ 1 \end{bmatrix}
M×P=P+t=
px+txpy+typz+tz1
其中
M
=
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
M= \begin{bmatrix} 1&0&0&t_{x}\\ 0&1&0&t_{y}\\ 0&0&1&t_{z}\\ 0&0&0&1 \end{bmatrix}
M=
100001000010txtytz1
相机坐标系到理想图像坐标系(不考虑畸变)
3维到3维,可逆
图像平面(感光板)上某一点
P
(
x
p
,
y
p
,
f
)
P(x_{p},y_{p},f)
P(xp,yp,f),相机坐标系下对应点
P
(
x
M
,
y
M
,
z
M
)
P(x_{M},y_{M},z_{M})
P(xM,yM,zM)
由相似三角形原理得
x
p
=
f
x
M
z
M
,
y
p
=
f
y
M
z
M
x_{p}=f\frac{x_{M}}{z_{M}},y_{p}=f\frac{y_{M}}{z_{M}}
xp=fzMxM,yp=fzMyM
化为齐次坐标
z
M
[
x
p
y
p
1
]
=
[
f
0
0
0
0
f
0
0
0
0
1
0
]
[
x
M
y
M
z
M
1
]
(2)
z_{M} \begin{bmatrix} x_{p}\\ y_{p}\\ 1 \end{bmatrix}=\begin{bmatrix} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} x_{M}\\ y_{M}\\ z_{M}\\ 1 \end{bmatrix} \tag{2}
zM
xpyp1
=
f000f0001000
xMyMzM1
(2)
其中,
f
f
f是像距。
实际上像素点再x,y方向上是可能有尺度偏差的,像素块左边与竖直线形成一个夹角a,所以上面矩阵有时写为
z
M
[
x
p
y
p
1
]
=
[
f
t
a
n
(
a
)
0
0
0
f
0
0
0
0
1
0
]
[
x
M
y
M
z
M
1
]
(2)
z_{M} \begin{bmatrix} x_{p}\\ y_{p}\\ 1 \end{bmatrix} =\begin{bmatrix} f&tan(a)&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} x_{M}\\ y_{M}\\ z_{M}\\ 1 \end{bmatrix} \tag{2}
zM
xpyp1
=
f00tan(a)f0001000
xMyMzM1
(2)
从理想图像坐标系到实际图像坐标系(考虑畸变)
3维到3维,可逆
透镜的畸变主要分为径向畸变和切向畸变(还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变)。
径向畸变–>透镜厚度工艺问题(光线在远离透镜中心的地方比靠近中心的地方更加弯曲,导致出现枕型畸变、桶形畸变),表现为极坐标下矢径变化
切向畸变–>组装工艺问题(透镜本身与图像平面不平行),表现为极坐标下角度变化
这部分本人也不了解,可以参考视频介绍:blibli
实际情况中我们常用r=0处的泰勒级数展开的前几项来近似描述径向畸变。矫正径向畸变前后的坐标关系为:
{
x
c
o
r
r
=
x
p
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
c
o
r
r
=
y
p
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
(3)
\begin{cases} x_{corr}=x_{p}(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6})\\ y_{corr}=y_{p}(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6})\tag{3} \end{cases}
{xcorr=xp(1+k1r2+k2r4+k3r6)ycorr=yp(1+k1r2+k2r4+k3r6)(3)
切向畸变需要两个额外的畸变参数来描述,矫正前后的坐标关系为:
{
r
2
=
x
p
2
+
y
p
2
x
c
o
r
r
=
x
p
+
[
2
p
1
x
p
y
p
+
p
2
(
r
2
+
2
x
p
2
)
]
y
c
o
r
r
=
y
p
+
[
p
1
(
r
2
+
2
y
p
2
+
2
p
2
x
p
y
p
)
]
(4)
\begin{cases} r^2=x_{p}^{2}+y_{p}^{2}\\ x_{corr}=x_{p}+[2p_{1}x_{p}y_{p}+p_{2}(r^{2}+2x_{p}^{2})]\\ y_{corr}=y_{p}+[p_{1}(r^2+2y_{p}^{2}+2p_{2}x_{p}y_{p})]\tag{4} \end{cases}
⎩
⎨
⎧r2=xp2+yp2xcorr=xp+[2p1xpyp+p2(r2+2xp2)]ycorr=yp+[p1(r2+2yp2+2p2xpyp)](4)
综上,我们一共需要5个畸变参数 k 1 , k 2 , k 3 , p 1 , p 2 k_{1},k_{2},k_{3},p_{1},p_{2} k1,k2,k3,p1,p2来描述透镜畸变。式(3)中,对于畸变很小的中心区域主要起作用的是 k 1 k_1 k1,对于畸变很大的边缘区域主要起作用的是 k 2 k_2 k2,对于畸变很大的鱼眼相机主要起作用的是 k 3 k_3 k3
从实际图像坐标系到像素坐标系
由于定义的像素坐标系原点与图像坐标系原点不重合,假设像素坐标系原点在图像坐标系下的坐标为
(
u
0
,
v
0
)
(u_{0},v_{0})
(u0,v0),单个像素点宽高折算在感光板上得物理长度为
d
x
,
d
y
d_{x},d_{y}
dx,dy
假设像点在实际图像坐标系下的坐标为
x
c
,
y
c
x_{c},y_{c}
xc,yc,于是可得到像点在像素坐标系下的坐标为:
u
=
f
x
c
d
x
+
u
0
,
v
=
f
y
c
d
y
+
v
0
u=\frac{fx_{c}}{d_{x}}+u_{0},v=\frac{fy_{c}}{d_{y}}+v_{0}
u=dxfxc+u0,v=dyfyc+v0
其中,
f
f
f是像距
化为其次坐标表示为
[
u
v
1
]
=
[
f
d
x
0
u
0
0
f
d
y
v
0
0
0
1
]
[
x
c
y
c
1
]
(5)
\begin{bmatrix} u\\ v\\ 1 \end{bmatrix} =\begin{bmatrix} \frac{f}{d_{x}}&0&u_{0}\\ 0&\frac{f}{d_{y}}&v_{0}\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_{c}\\ y_{c}\\ 1 \end{bmatrix} \tag{5}
uv1
=
dxf000dyf0u0v01
xcyc1
(5)
注:有些公式额外提到了感光板横纵边角的系数(通常是90),这里暂不考虑
内外参具体求法
综上,外参公式为式(1),内参公式为式(2)(5),内参公式可以写到一起
假设提供
K
K
K个棋盘图像,每个棋盘有
N
N
N个焦点,于是能得到2KN个约束方程。忽略畸变的情况下,需要求解5个内参(
u
0
,
v
0
,
f
,
d
x
,
d
y
u_{0},v_{0},f,d_{x},d_{y}
u0,v0,f,dx,dy)和6K个外参(
θ
x
,
θ
y
,
θ
z
,
t
x
,
t
y
,
t
z
\theta_{x},\theta_{y},\theta_{z},t_{x},t_{y},t_{z}
θx,θy,θz,tx,ty,tz)。当
2
K
N
≥
5
+
6
K
2KN\geq5+6K
2KN≥5+6K时,就可以解出无畸变条件下的内参和外参
实际上我们往往会在一张棋盘上布置更多的角点,因为这样就可以通过最小二乘法求得最优解了,同样地,我们会需要至少10张以上的棋盘图像,目的是考虑数值稳定性和提高信噪比,得到更高质量的结果。