Geometric camera calibration using circular control points
链接http://www.ee.oulu.fi/~jth/calibr/
作者:竹石
相机标定可以归纳为 P − n − P P-n-P P−n−P(Perspective-n-Point)的问题,即已知三维物点坐标和对应的二维投影坐标,求解相机参数。由于镜头的畸变(径向和切向)带来非线性成像模型,一般求解方法分为两步:
- 不考虑畸变,成像模型为线性模型,利用线性求解方法求出初始解
- 考虑畸变,利用初始解和成像模型对三维物点投影得到的投影点与观测点形成最优问题, 通过最小二乘进行估计。
这篇文章的精彩之处在于给出逆畸变模型,在上两步的基础上,利用逆畸变模型进一步优化畸变参数。
文章的主要框架内容:
文章目录
1.相机模型
1.1正投影模型
[ u v 1 ] = λ P [ R t 0 T 1 ] [ X w Y w Z w 1 ] = λ F [ X w Y w Z w 1 ] (1) \left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\lambda P\left[\begin{array}{cc} R& t \\ 0^{T} & 1 \end{array}\right]\left[\begin{array}{l} X_w \\ Y_w \\ Z_w \\ 1 \end{array}\right]=\lambda F\left[\begin{array}{l} X_w \\ Y_w \\ Z_w \\ 1 \end{array}\right] \tag{1} ⎣ ⎡uv1⎦ ⎤=λP[R0Tt1]⎣ ⎡XwYwZw1⎦ ⎤=λF⎣ ⎡XwYwZw1⎦ ⎤(1)
其中, A w = [ X w Y w Z w ] T A_w=[X_w \quad Y_w \quad Z_w]^T Aw=[XwYwZw]T 表示世界坐标系某一物点,$a=[u \quad v]^T $ 表示图像坐标系中的投影点, λ \lambda λ表示缩放因子。
相机的内参:
P
=
[
s
f
0
u
0
0
0
f
v
0
0
0
0
1
0
]
{P}=\left[\begin{array}{llll} sf & 0 & u_{0} & 0 \\ 0 & f & v_{0} & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]
P=⎣
⎡sf000f0u0v01000⎦
⎤
其中
f
f
f表示焦距,
(
u
0
,
v
0
)
(u_0,v_0)
(u0,v0)表示主点坐标,
s
s
s表示横纵比。
相机的外参:
旋转矩阵 R R R 是一个 3 × 3 3\times 3 3×3的正交旋转矩阵,可用三个欧拉角 w w w、 φ \varphi φ 、 k k k 定义;平移矩阵 t = [ t x t y t z ] t=[t_x \quad t_y \quad t_z] t=[txtytz]。
相机的畸变模型:
a
c
=
a
d
+
F
D
(
a
d
,
δ
)
(2)
a_c=a_d+\mathcal{F}_{D}\left(\mathbf{a}_{d}, \delta\right)\tag{2}
ac=ad+FD(ad,δ)(2)
其中
a
c
=
[
u
c
v
c
]
T
a_c=[u_c \quad v_c]^T
ac=[ucvc]T表示矫正后的投影点,
a
d
=
[
u
d
v
d
]
T
a_d=[u_d \quad v_d]^T
ad=[udvd]T表示畸变点。
F
D
(
a
d
,
δ
)
\mathcal{F}_{D}\left(\mathbf{a}_{d}, \delta\right)
FD(ad,δ)为多项式,表示如下,
F
D
(
a
d
,
δ
)
=
[
u
ˉ
d
(
k
1
r
d
2
+
k
2
r
d
4
+
k
3
r
d
6
+
…
)
+
(
2
p
1
u
ˉ
d
v
ˉ
d
+
p
2
(
r
d
2
+
2
u
ˉ
d
2
)
)
(
1
+
p
3
r
d
2
+
…
)
v
ˉ
d
(
k
1
r
d
2
+
k
2
r
d
4
+
k
3
r
d
6
+
…
)
+
(
p
1
(
r
d
2
+
2
v
ˉ
d
2
)
+
2
p
2
u
ˉ
d
v
ˉ
d
)
(
1
+
p
3
r
d
2
+
…
)
]
\mathcal{F}_{D}\left(\mathbf{a}_{d}, \delta\right)=\left[\begin{array}{l} \bar{u}_{d}\left(k_{1} r_{d}^{2}+k_{2} r_{d}^{4}+k_{3} r_{d}^{6}+\ldots\right)+\left(2 p_{1} \bar{u}_{d} \bar{v}_{d}+p_{2}\left(r_{d}^{2}+2 \bar{u}_{d}^{2}\right)\right)\left(1+p_{3} r_{d}^{2}+\ldots\right) \\ \bar{v}_{d}\left(k_{1} r_{d}^{2}+k_{2} r_{d}^{4}+k_{3} r_{d}^{6}+\ldots\right)+\left(p_{1}\left(r_{d}^{2}+2 \bar{v}_{d}^{2}\right)+2 p_{2} \bar{u}_{d} \bar{v}_{d}\right)\left(1+p_{3} r_{d}^{2}+\ldots\right) \end{array}\right]
FD(ad,δ)=[uˉd(k1rd2+k2rd4+k3rd6+…)+(2p1uˉdvˉd+p2(rd2+2uˉd2))(1+p3rd2+…)vˉd(k1rd2+k2rd4+k3rd6+…)+(p1(rd2+2vˉd2)+2p2uˉdvˉd)(1+p3rd2+…)]
其中
δ
=
[
k
1
,
k
2
,
…
,
p
1
,
p
2
,
…
]
T
\delta=\left[k_{1}, k_{2}, \ldots, p_{1}, p_{2}, \ldots\right]^{\mathrm{T}}
δ=[k1,k2,…,p1,p2,…]T为畸变系数,$k_1,k_2,……
表示径向畸变系数,
表示径向畸变系数,
表示径向畸变系数,p_1,p_2,……
表示切向畸变系数,
表示切向畸变系数,
表示切向畸变系数,r_{c}{2}=u_{c}{2}+v_{c}^{2}$。
1.2反投影模型
设平面 Π Π Π 以 h 0 = [ X 0 Y 0 Z 0 ] h_0=[X_0\quad Y_0\quad Z_0] h0=[X0Y0Z0]为原点,以 h 1 = [ X 1 Y 1 Z 1 ] h_1=[X_1\quad Y_1\quad Z_1] h1=[X1Y1Z1]和 h 2 = [ X 2 Y 2 Z 2 ] h_2=[X_2\quad Y_2\quad Z_2] h2=[X2Y2Z2]为两个基。则平面 Π Π Π上的任意一点 ( X H , Y H ) (X_H,Y_H) (XH,YH)对应的世界坐标系为: X H h 1 + Y H h 2 + h 0 X_H h_1+Y_Hh_2+h_0 XHh1+YHh2+h0。
即:
[
h
1
h
2
h
0
0
0
1
]
[
X
H
Y
H
1
]
=
H
[
X
H
Y
H
1
]
\left[\begin{array}{ccc} h_{1} & h_{2} & h_{0} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]=H\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]
[h10h20h01]⎣
⎡XHYH1⎦
⎤=H⎣
⎡XHYH1⎦
⎤
正投影模型为:
[
u
H
v
H
1
]
=
F
P
H
=
λ
F
H
[
X
H
Y
H
1
]
\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right]=F P_{H}=\lambda F H\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]
⎣
⎡uHvH1⎦
⎤=FPH=λFH⎣
⎡XHYH1⎦
⎤
即反投影模型:
λ
[
X
H
Y
H
1
]
=
(
F
H
)
−
1
[
u
H
v
H
1
]
(3)
\lambda\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]=(F H)^{-1}\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right] \tag{3}
λ⎣
⎡XHYH1⎦
⎤=(FH)−1⎣
⎡uHvH1⎦
⎤(3)
1.3需要标定的参数:
6个相机外参:
t
x
、
t
y
、
t
z
、
w
、
φ
、
k
t_x、t_y、t_z、w、\varphi、k
tx、ty、tz、w、φ、k
8个相机内参(仅考虑了径向和切向起主导的前两个畸变系数):
s
、
f
、
u
0
、
v
0
、
k
1
、
k
2
、
p
1
、
p
2
s、f、u_0、v_0、k_1、k_2、p_1、p_2
s、f、u0、v0、k1、k2、p1、p2
2.圆形标定点的偏差校正
透视投影不是保形变换,直线在透视投影模型下为直线,一般二维或三维形状与图像平面不共面时会发生变形。常用的标定板是棋盘格,棋盘格的角点是包型变换,但不易精准检测。圆形标定板也是校准中常用的标定板,圆形可以准确的找到中心点,但通过透视投影圆心会发生偏差。
平面二次曲线一般形式:
A
X
H
2
+
2
B
X
H
Y
H
+
C
Y
H
2
+
2
D
X
H
+
2
E
Y
H
+
F
=
0
A X_{H}^{2}+2 B X_{H} Y_{H}+C Y_{H}^{2}+2 D X_{H}+2 E Y_{H}+F=0
AXH2+2BXHYH+CYH2+2DXH+2EYH+F=0
矩阵形式:
[
X
H
Y
H
1
]
[
A
B
D
B
C
E
D
E
F
]
[
X
H
Y
H
1
]
=
0
\left[\begin{array}{lll} X_{H} & Y_{H} & 1 \end{array}\right]\left[\begin{array}{ccc} A & B & D \\ B & C & E \\ D & E & F \end{array}\right]\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]=0
[XHYH1]⎣
⎡ABDBCEDEF⎦
⎤⎣
⎡XHYH1⎦
⎤=0
令:
Q
=
[
A
B
D
B
C
E
D
E
F
]
Q=\left[\begin{array}{lll} A & B & D \\ B & C & E \\ D & E & F \end{array}\right]
Q=⎣
⎡ABDBCEDEF⎦
⎤
则圆的表示形式:
Q
=
[
−
1
r
2
0
0
0
−
1
r
2
0
0
0
1
]
\begin{aligned} Q=\left[\begin{array}{ccc} -\frac{1}{r^{2}} & 0 & 0 \\ 0 & -\frac{1}{r^{2}} & 0 \\ 0 & 0 & 1 \end{array}\right] \end{aligned}
Q=⎣
⎡−r21000−r210001⎦
⎤
得:
[
X
H
Y
H
1
]
Q
[
X
H
Y
H
1
]
=
0
(4)
\left[\begin{array}{lll} X_{H} & Y_{H} & 1 \end{array}\right] \mathrm{Q}\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]=0 \tag{4}
[XHYH1]Q⎣
⎡XHYH1⎦
⎤=0(4)
因为反相机模型:
λ
[
X
H
Y
H
1
]
=
(
F
H
)
−
1
[
u
H
v
H
1
]
(5)
\lambda\left[\begin{array}{c} X_{H} \\ Y_{H} \\ 1 \end{array}\right]=(F H)^{-1}\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right] \tag{5}
λ⎣
⎡XHYH1⎦
⎤=(FH)−1⎣
⎡uHvH1⎦
⎤(5)
(5)带入(4)得
(
(
F
H
)
−
1
[
u
H
v
H
1
]
)
T
Q
(
F
H
)
−
1
[
u
H
v
H
1
]
=
0
\left(\begin{array}{l} (F H)^{-1}\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right] \end{array}\right)^{T} Q(F H)^{-1}\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right]=0
⎝
⎛(FH)−1⎣
⎡uHvH1⎦
⎤⎠
⎞TQ(FH)−1⎣
⎡uHvH1⎦
⎤=0
进一步整理:
(
[
u
H
v
H
1
]
)
T
(
(
F
H
)
−
1
)
T
Q
(
F
H
)
−
1
[
u
H
v
H
1
]
=
0
\left(\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right]\right)^{T}\left((F H)^{-1}\right)^{T} Q(F H)^{-1}\left[\begin{array}{c} u_{H} \\ v_{H} \\ 1 \end{array}\right]=0
⎝
⎛⎣
⎡uHvH1⎦
⎤⎠
⎞T((FH)−1)TQ(FH)−1⎣
⎡uHvH1⎦
⎤=0
令
S
=
(
(
F
H
)
−
1
)
T
Q
(
F
H
)
−
1
S=\left((F H)^{-1}\right)^{T} Q(F H)^{-1}
S=((FH)−1)TQ(FH)−1,则
S
−
1
=
F
H
Q
−
1
H
T
F
T
S^{-1}=F H Q^{-1} H^{T} F^{T}
S−1=FHQ−1HTFT。
令
G
=
H
Q
−
1
H
T
G=H Q^{-1} H^{T}
G=HQ−1HT,由引文[1]得:
λ
[
u
e
v
e
1
]
=
F
G
F
T
[
0
0
1
]
=
F
G
f
3
(6)
\lambda\left[\begin{array}{l} u_{e} \\ v_{e} \\ 1 \end{array}\right]=F G F^{T}\left[\begin{array}{l} 0 \\ 0 \\ 1 \end{array}\right]=F G f_{3}\tag{6}
λ⎣
⎡ueve1⎦
⎤=FGFT⎣
⎡001⎦
⎤=FGf3(6)
其中
f
3
f_{3}
f3 表示
F
F
F 的最后一行,利用(6)代替相机正投影模型(1)可以修正椭圆的中心,获得无偏估计。
3.逆畸变模型
畸变矫正:
a
c
=
a
d
+
F
D
(
a
d
,
δ
)
(7)
a_{c}=a_{d}+\mathcal{F}_{D}\left(a_{d}, \delta\right) \tag{7}
ac=ad+FD(ad,δ)(7)
其中, 正确或矫正后的坐标
a
c
=
[
u
c
,
v
c
]
T
;
a_{c}=\left[u_{c}, v_{c}\right]^{T} ;
ac=[uc,vc]T; 畸变坐标:
a
d
=
[
u
d
,
v
d
]
T
a_{d}=\left[u_{d}, v_{d}\right]^{T}
ad=[ud,vd]T 。
3.1递归逆畸变模型
由(4)可得:
a
d
=
a
c
−
F
D
(
a
d
,
δ
)
=
a
c
−
F
D
(
a
c
−
F
D
(
a
d
,
δ
)
,
δ
)
=
⋯
a_{d}=a_{c}-\mathcal{F}_{D}\left(a_{d}, \delta\right)=a_{c}-\mathcal{F}_{D}\left(a_{c}-\mathcal{F}_{D}\left(a_{d}, \delta\right), \delta\right)=\cdots
ad=ac−FD(ad,δ)=ac−FD(ac−FD(ad,δ),δ)=⋯
在每次迭代中,等号右侧用(7)替换
a
d
a_d
ad时会使误差减少。在实践中,至少需要三到四次迭代来补偿镜头畸变,需要在图像的不同位置多次评估失真函数,使得递归逆畸变模型不实用。
3.2非递归逆畸变模型:
采用一阶泰勒级数对
F
D
(
a
d
,
δ
)
\mathcal{F}_{D}\left(a_{d}, \delta\right)
FD(ad,δ)近似表示:
F
D
(
a
d
,
δ
)
≈
F
D
(
a
c
,
δ
)
+
D
(
a
c
)
(
a
d
−
a
c
)
\begin{aligned} &\mathcal{F}_{D}\left(a_{d}, \delta\right) \approx \mathcal{F}_{D}\left(a_{c}, \delta\right)+D\left(a_{c}\right)\left(a_{d}-a_{c}\right) \\ \end{aligned}
FD(ad,δ)≈FD(ac,δ)+D(ac)(ad−ac)
(7)可以表示为:
a
c
≈
a
d
+
F
D
(
a
c
,
δ
)
+
D
(
a
c
)
(
a
d
−
a
c
)
a_{c} \approx a_{d}+\mathcal{F}_{D}\left(a_{c}, \delta\right)+D\left(a_{c}\right)\left(a_{d}-a_{c}\right)
ac≈ad+FD(ac,δ)+D(ac)(ad−ac)
则,
a
d
≈
a
c
−
1
d
11
(
a
c
)
+
d
22
(
a
c
)
+
1
F
D
(
a
c
,
δ
)
≡
a
c
−
F
D
∗
(
a
c
,
δ
)
a_{d} \approx a_{c}-\frac{1}{d_{11}\left(a_{c}\right)+d_{22}\left(a_{c}\right)+1} \mathcal{F}_{D}\left(a_{c}, \delta\right) \equiv a_{c}-\mathcal{F}_{D}^{*}\left(a_{c}, \delta\right)
ad≈ac−d11(ac)+d22(ac)+11FD(ac,δ)≡ac−FD∗(ac,δ)
两个径向
k
1
k_{1}
k1 和
k
2
k_{2}
k2 及切向畸变系数
p
1
p_{1}
p1 和
p
2
p_{2}
p2, 则逆畸变模型的近似值表示:
F
D
∗
(
a
c
,
δ
)
≈
F
D
(
a
c
,
δ
)
4
k
1
r
c
2
+
6
k
2
r
c
4
+
8
p
1
v
c
+
8
p
2
u
c
+
1
(8)
\mathcal{F}_{D}^{*}\left(a_{c}, \delta\right) \approx \frac{\mathcal{F}_{D}\left(a_{c}, \delta\right)}{4 k_{1} r_{c}^{2}+6 k_{2} r_{c}^{4}+8 p_{1} v_{c}+8 p_{2} u_{c}+1} \tag{8}
FD∗(ac,δ)≈4k1rc2+6k2rc4+8p1vc+8p2uc+1FD(ac,δ)(8)
其中,
r
c
2
=
u
c
2
+
v
c
2
r_{c}^{2}=u_{c}^{2}+v_{c}^{2}
rc2=uc2+vc2
那么对像素点
a
c
a_{c}
ac, 利用逆畸变模型进行畸变后的坐标表示为
a
d
a_{d}
ad, 数学描述为:
a
d
≈
a
c
−
F
D
∗
(
a
c
,
δ
)
(9)
a_{d} \approx a_{c}-\mathcal{F}_{D}^{*}\left(a_{c}, \delta\right)\tag{9}
ad≈ac−FD∗(ac,δ)(9)
4.利用逆畸变模型优化畸变系数
通过step1和step2得到的相机参数,利用公式(7)进行矫正,得到矫正坐标 a c a_c ac。利用(9)对矫正坐标 a c a_c ac进行扭曲得到扭曲坐标,则:
a
c
−
a
d
=
F
D
(
a
d
,
δ
)
=
B
δ
(10)
a_{c}-a_{d}=\mathcal{F}_{D}\left(a_{d}, \delta\right)=B \delta\tag{10}
ac−ad=FD(ad,δ)=Bδ(10)
畸变系数:
F
D
(
a
d
,
δ
)
=
[
u
ˉ
d
(
k
1
r
d
2
+
k
2
r
d
4
+
k
3
r
d
6
+
…
)
+
(
2
p
1
u
ˉ
d
v
ˉ
d
+
p
2
(
r
d
2
+
2
u
ˉ
d
2
)
)
(
1
+
p
3
r
d
2
+
…
)
v
ˉ
d
(
k
1
r
d
2
+
k
2
r
d
4
+
k
3
r
d
6
+
…
)
+
(
p
1
(
r
d
2
+
2
v
ˉ
d
2
)
+
2
p
2
u
ˉ
d
v
ˉ
d
)
(
1
+
p
3
r
d
2
+
…
)
]
\mathcal{F}_{D}\left(\mathbf{a}_{d}, \delta\right)=\left[\begin{array}{l} \bar{u}_{d}\left(k_{1} r_{d}^{2}+k_{2} r_{d}^{4}+k_{3} r_{d}^{6}+\ldots\right)+\left(2 p_{1} \bar{u}_{d} \bar{v}_{d}+p_{2}\left(r_{d}^{2}+2 \bar{u}_{d}^{2}\right)\right)\left(1+p_{3} r_{d}^{2}+\ldots\right) \\ \bar{v}_{d}\left(k_{1} r_{d}^{2}+k_{2} r_{d}^{4}+k_{3} r_{d}^{6}+\ldots\right)+\left(p_{1}\left(r_{d}^{2}+2 \bar{v}_{d}^{2}\right)+2 p_{2} \bar{u}_{d} \bar{v}_{d}\right)\left(1+p_{3} r_{d}^{2}+\ldots\right) \end{array}\right]
FD(ad,δ)=[uˉd(k1rd2+k2rd4+k3rd6+…)+(2p1uˉdvˉd+p2(rd2+2uˉd2))(1+p3rd2+…)vˉd(k1rd2+k2rd4+k3rd6+…)+(p1(rd2+2vˉd2)+2p2uˉdvˉd)(1+p3rd2+…)]
B
B
B 矩阵可以写为:
B
(
i
)
=
[
u
ˉ
d
(
i
)
r
d
2
(
i
)
u
ˉ
d
(
i
)
r
d
4
(
i
)
…
2
u
ˉ
d
(
i
)
v
ˉ
d
(
i
)
r
d
2
(
i
)
+
2
u
ˉ
d
2
(
i
)
…
v
ˉ
d
(
i
)
r
d
2
(
i
)
v
ˉ
d
(
i
)
r
d
4
(
i
)
…
r
d
2
(
i
)
+
2
v
ˉ
d
2
(
i
)
2
u
ˉ
d
(
i
)
v
ˉ
d
(
i
)
…
]
\mathbf{B}(i)=\left[\begin{array}{lllll} \bar{u}_{d}(i) r_{d}^{2}(i) & \bar{u}_{d}(i) r_{d}^{4}(i) & \ldots & 2 \bar{u}_{d}(i) \bar{v}_{d}(i) & r_{d}^{2}(i)+2 \bar{u}_{d}^{2}(i) & \ldots \\ \bar{v}_{d}(i) r_{d}^{2}(i) & \bar{v}_{d}(i) r_{d}^{4}(i) & \ldots & r_{d}^{2}(i)+2 \bar{v}_{d}^{2}(i) & 2 \bar{u}_{d}(i) \bar{v}_{d}(i) & \ldots \end{array}\right]
B(i)=[uˉd(i)rd2(i)vˉd(i)rd2(i)uˉd(i)rd4(i)vˉd(i)rd4(i)……2uˉd(i)vˉd(i)rd2(i)+2vˉd2(i)rd2(i)+2uˉd2(i)2uˉd(i)vˉd(i)……]
δ
\delta
δ 矩阵可以写为:
δ
=
[
k
1
k
2
…
p
1
p
2
…
k
1
k
2
…
p
1
p
2
…
]
\delta=\left[\begin{array}{llllll} k_{1} & k_{2} & \ldots & p_{1} & p_{2} & \ldots \\ k_{1} & k_{2} & \ldots & p_{1} & p_{2} & \ldots \end{array}\right]
δ=[k1k1k2k2……p1p1p2p2……]
则畸变系数优化求解方法:
δ
=
[
B
]
+
[
a
c
−
a
d
]
\delta=[B]^{+}\left[a_{c}-a_{d}\right]
δ=[B]+[ac−ad]
其中,
[
.
]
+
[.]^+
[.]+表示矩阵的伪逆。
5.验证逆畸变模型的精度
求未矫正坐标和扭曲坐标的距离 ∣ a d − a 0 ∣ |a_d-a_0| ∣ad−a0∣来验证逆畸变模型的正确性。
未矫正坐标和扭曲坐标之间的差异可用直方图表示,表明误差小于0.01像素。
引文:
[1]K. Kanatani,Geometric computation for Machine Vision, Oxford: Clarendon Press, 1993.