张正友标定法
1.相机标定的含义
相机标定是世界坐标系与图像坐标系关系建立过程中,确定相机的内部固定参数的过程。比如工业相机在设计时有一个具体的焦距,光心等参数,但是实际做出来可能会和设计时有所偏差,相机标定就是确定相机在实际拍摄使用时的参数。(可以类比电器的额定功率和实际功率)
2.相机标定的输出参数(内参)
相机标定的参数称为内参。主要有光心位置( δ x \delta x δx, δ y \delta y δy),焦距( f x f_x fx, f y f_y fy)。这些参数构成了一个内参矩阵。此外如果考虑畸变的影响,根据不同的畸变模型,输出畸变的参数。
3.外参
外参是拍摄的图像与相机坐标系之间的关系。每张照片不同位置不同角度,外参都不一样。该参数并没有很重要。
4.世界坐标系和图像坐标系转换
这个推导过程因为不是很难也不是重点,此处省略,可以看看这篇文章。https://blog.csdn.net/byyastal/article/details/108474083
它们的转换关系为:
解释一个里面的重要参数含义:
f
x
f_x
fx:x方向的焦距,注意此处
f
=
f
x
∗
d
x
f=f_x * dx
f=fx∗dx,
f
f
f才是真正光学意义上的焦距(mm),
d
x
dx
dx是像元单位,一般是μm级别
f
y
f_y
fy:y方向的焦距,注意此处
f
=
f
x
∗
d
x
f=f_x * dx
f=fx∗dx
u
0
u_0
u0:图像坐标系x轴起始坐标,一般都是0
v
0
v_0
v0:图像坐标系y轴起始坐标,一般都是0
R
R
R:旋转矩阵,具体参考旋转矩阵的特点
T
T
T:平移向量
X
w
,
Y
w
,
Z
w
X_w,Y_w,Z_w
Xw,Yw,Zw:世界坐标系坐标,是一个三维坐标系
u
,
v
u,v
u,v:是图像上的坐标,是一个二维坐标
Z
c
Z_c
Zc:是一个缩放因子,同一幅图像中不同点的缩放因子不同,后续公式中的
λ
\lambda
λ也指的是这个值。
5.求解单应矩阵
要求解内参,第一步是要求解单应矩阵,求解了单应矩阵,后面再进一步通过某些方法(如张正友标定法)求解内参矩阵。一般定标的方法第一步都是如此。
单应矩阵为内参矩阵和外参矩阵的乘积。
即:
其中,
M
M
M是内参矩阵,
s
s
s为缩放因子的倒数,
r
1
r_1
r1、
r
2
r_2
r2是旋转矩阵的两个列向量,
t
t
t为平移向量。
单应矩阵的求解过程:
设单应矩阵为H:
H
=
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
H=\left[\begin{array}{lll} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{array}\right]
H=⎣⎡h11h21h31h12h22h32h13h23h33⎦⎤
则有:
[
x
′
y
′
1
]
∼
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
[
x
y
1
]
\left[\begin{array}{c} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right] \sim\left[\begin{array}{lll} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]
⎣⎡x′y′1⎦⎤∼⎣⎡h11h21h31h12h22h32h13h23h33⎦⎤⎣⎡xy1⎦⎤
矩阵展开后有3个等式,将第3个等式代入前两个等式中可得:
x
′
=
h
11
x
+
h
12
y
+
h
13
h
31
x
+
h
32
y
+
h
33
y
′
=
h
21
x
+
h
22
y
+
h
23
h
31
x
+
h
32
y
+
h
33
\begin{aligned} x^{\prime} &=\frac{h_{11} x+h_{12} y+h_{13}}{h_{31} x+h_{32} y+h_{33}} \\ y^{\prime} &=\frac{h_{21} x+h_{22} y+h_{23}}{h_{31} x+h_{32} y+h_{33}} \end{aligned}
x′y′=h31x+h32y+h33h11x+h12y+h13=h31x+h32y+h33h21x+h22y+h23
也就是说,一个点对对应两个等式。H矩阵我们令
h
3
3
h_33
h33为1,则一共有8个未知数,所以需要至少四个点求解。
一般都用大于4个的点求解,然后利用LM等优化方法得到最合适的单应矩阵H。具体的话,可以使用matlab和OpenCV中的函数来求解单应矩阵。分别是estimateGeometricTransform
和findHomography
函数。
5.张正友标定算法
上述步骤中求得了单应矩阵H,则:
H
=
s
[
f
x
γ
u
0
0
f
y
v
0
0
0
1
]
[
r
1
r
2
t
]
=
s
M
[
r
1
r
2
t
]
H=s\left[\begin{array}{ccc} f_{x} & \gamma & u_{0} \\ 0 & f_{y} & v_{0} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{lll} r_{1} & r_{2} & t \end{array}\right]=s M\left[\begin{array}{lll} r_{1} & r_{2} & t \end{array}\right]
H=s⎣⎡fx00γfy0u0v01⎦⎤[r1r2t]=sM[r1r2t]
我们知道H是内参矩阵和外参矩阵的混合体,而我们想要最终分别获得内参和外参。所以需要想个办法,先把内参求出来(先求内参是因为更容易,因为每张图片的内参都是固定的,而外参是变化的),得到内参后,那张标定图片的外参也就随之解出了。
为了利用旋转向量之间的约束关系,我们先将单应性矩阵H化为3个列向量,即H=[
h
1
h_1
h1
h
2
h_2
h2
h
3
h_3
h3],则有
H
=
[
h
1
h
2
h
3
]
=
s
M
[
r
1
r
2
t
]
H=\left[\begin{array}{lll} \mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3} \end{array}\right]=s M\left[\begin{array}{lll} r_{1} & r_{2} & t \end{array}\right]
H=[h1h2h3]=sM[r1r2t]按元素对应关系可得:
因为旋转向量在构造中是相互正交的,即r1和r2相互正交,由此我们就可以利用“正交”的两个含义,得出每个单应矩阵提供的两个约束条件:
约束条件1: 旋转向量点积为0(两垂直平面上的旋转向量互相垂直),这个可以参考上面对旋转矩阵的性质介绍 – 旋转矩阵的每一列都是彼此正交,且模为1,即:
约束条件2: 旋转向量长度相等(旋转不改变尺度),(我认为还是上面的那个性质–旋转矩阵的每一列都是彼此正交,且模为1)即:
记
(
M
−
1
)
T
M
−
1
\left(M^{-1}\right)^{T} M^{-1}
(M−1)TM−1为B展开:
B
=
(
M
−
1
)
T
M
−
1
=
[
1
f
x
2
−
γ
f
x
2
f
y
v
0
γ
−
u
0
f
y
f
x
2
f
y
−
γ
f
x
2
f
y
γ
2
f
x
2
f
y
2
+
1
f
y
2
−
γ
v
0
γ
−
u
0
f
y
f
x
2
f
y
y
2
−
v
0
f
y
2
v
0
γ
−
u
0
f
y
f
x
2
f
y
−
γ
v
0
γ
−
u
0
f
y
f
x
2
f
y
2
−
v
0
f
y
2
(
v
0
γ
−
u
0
f
y
)
2
f
x
2
f
y
2
+
v
0
2
f
y
2
+
1
]
=
[
B
11
B
12
B
13
B
21
B
22
B
23
B
31
B
32
B
33
]
B=\left(M^{-1}\right)^{T} M^{-1}=\left[\begin{array}{ccc} \frac{1}{f_{x}^{2}} & -\frac{\gamma}{f_{x}^{2} f_{y}} & \frac{v_{0} \gamma-u_{0} f_{y}}{f_{x}^{2} f_{y}} \\ -\frac{\gamma}{f_{x}^{2} f_{y}} & \frac{\gamma^{2}}{f_{x}^{2} f_{y}^{2}}+\frac{1}{f_{y}^{2}} & -\gamma \frac{v_{0} \gamma-u_{0} f_{y}}{f_{x}^{2} f_{y y}^{2}}-\frac{v_{0}}{f_{y}^{2}} \\ \frac{v_{0} \gamma-u_{0} f_{y}}{f_{x}^{2} f_{y}} & -\gamma \frac{v_{0} \gamma-u_{0} f_{y}}{f_{x}^{2} f_{y}^{2}}-\frac{v_{0}}{f_{y}^{2}} & \frac{\left(v_{0} \gamma-u_{0} f_{y}\right)^{2}}{f_{x}^{2} f_{y}^{2}}+\frac{v_{0}^{2}}{f_{y}^{2}}+1 \end{array}\right]=\left[\begin{array}{lll} B_{11} & B_{12} & B_{13} \\ B_{21} & B_{22} & B_{23} \\ B_{31} & B_{32} & B_{33} \end{array}\right]
B=(M−1)TM−1=⎣⎢⎢⎡fx21−fx2fyγfx2fyv0γ−u0fy−fx2fyγfx2fy2γ2+fy21−γfx2fy2v0γ−u0fy−fy2v0fx2fyv0γ−u0fy−γfx2fyy2v0γ−u0fy−fy2v0fx2fy2(v0γ−u0fy)2+fy2v02+1⎦⎥⎥⎤=⎣⎡B11B21B31B12B22B32B13B23B33⎦⎤
这里其实B中包含了一个尺度因子
λ
\lambda
λ,因为求模运算两边相等时,有一个
λ
\lambda
λ被消去。B为对称矩阵,真正有用的元素只有6个(主对角线任意一侧的6个元素)。把B带入前面两个约束条件后可转化为:
{
h
1
T
B
h
2
=
0
h
1
T
B
h
1
=
h
2
T
B
h
2
\left\{\begin{array}{l} h_{1}^{T} B h_{2}=0 \\ h_{1}^{T} B h_{1}=h_{2}^{T} B h_{2} \end{array}\right.
{h1TBh2=0h1TBh1=h2TBh2
上面两约束中的式子均可写为通式:
h
i
T
B
h
j
h_{i}^{T} B h_{j}
hiTBhj,定义3X3的单应矩阵H=[h1 h2 h3]的第i列列向量:
h
i
=
[
h
i
1
,
h
i
2
,
h
i
3
]
h_{i}=\left[h_{i 1}, h_{i 2}, h_{i 3}\right]
hi=[hi1,hi2,hi3]将如下表达式代入上述的约束单项式:
h
i
T
B
h
j
=
[
h
i
1
h
j
1
h
i
1
h
j
2
+
h
i
2
h
j
1
h
i
2
h
j
2
h
i
3
h
j
1
+
h
i
1
h
j
3
h
i
3
h
j
2
+
h
i
2
h
j
3
h
i
3
h
j
3
]
T
[
B
11
B
12
B
22
B
13
B
23
B
33
]
h_{i}^{T} B h_{j}=\left[\begin{array}{c} h_{\mathrm{i1}} h_{j 1} \\ h_{i 1} h_{j 2}+h_{i 2} h_{j 1} \\ h_{i 2} h_{j 2} \\ h_{i 3} h_{j 1}+h_{i 1} h_{j 3} \\ h_{i 3} h_{j 2}+h_{i 2} h_{j 3} \\ h_{i 3} h_{j 3} \end{array}\right]^{T}\left[\begin{array}{c} B_{11} \\ B_{12} \\ B_{22} \\ B_{13} \\ B_{23} \\ B_{33} \end{array}\right]
hiTBhj=⎣⎢⎢⎢⎢⎢⎢⎡hi1hj1hi1hj2+hi2hj1hi2hj2hi3hj1+hi1hj3hi3hj2+hi2hj3hi3hj3⎦⎥⎥⎥⎥⎥⎥⎤T⎣⎢⎢⎢⎢⎢⎢⎡B11B12B22B13B23B33⎦⎥⎥⎥⎥⎥⎥⎤为了简化表达形式,令:
v
i
j
=
[
h
i
h
j
1
h
i
1
h
j
2
+
h
i
2
h
j
1
h
i
2
h
j
2
h
i
3
h
j
1
+
h
i
1
h
j
3
h
i
3
h
j
2
+
h
i
2
h
j
3
h
i
3
h
j
3
]
,
b
=
[
B
11
B
12
B
22
B
13
B
23
B
33
]
v_{i j}=\left[\begin{array}{c} h_{\mathrm{i}} h_{j 1} \\ h_{i 1} h_{j 2}+h_{i 2} h_{j 1} \\ h_{i 2} h_{j 2} \\ h_{i 3} h_{j 1}+h_{i 1} h_{j 3} \\ h_{i 3} h_{j 2}+h_{i 2} h_{j 3} \\ h_{i 3} h_{j 3} \end{array}\right], \quad b=\left[\begin{array}{c} B_{11} \\ B_{12} \\ B_{22} \\ B_{13} \\ B_{23} \\ B_{33} \end{array}\right]
vij=⎣⎢⎢⎢⎢⎢⎢⎡hihj1hi1hj2+hi2hj1hi2hj2hi3hj1+hi1hj3hi3hj2+hi2hj3hi3hj3⎦⎥⎥⎥⎥⎥⎥⎤,b=⎣⎢⎢⎢⎢⎢⎢⎡B11B12B22B13B23B33⎦⎥⎥⎥⎥⎥⎥⎤则有:
h
i
T
B
h
j
=
ν
i
j
T
b
h_{i}^{T} B h_{j}=\nu_{i j}^{T} b
hiTBhj=νijTb由此,两约束条件最终可以转化为如下形式:
v
12
T
b
=
0
(
v
11
T
−
v
22
T
)
b
=
0
→
[
v
12
T
v
11
T
−
v
22
T
]
b
=
0
\begin{array}{l} v_{12}{ }^{T} b=0 \\ \left(v_{11}{ }^{T}-v_{22}{ }^{T}\right) b=0 \end{array} \rightarrow\left[\begin{array}{c} v_{12}{ }^{T} \\ v_{11}{ }^{T}-v_{22}{ }^{T} \end{array}\right] b=0
v12Tb=0(v11T−v22T)b=0→[v12Tv11T−v22T]b=0如果我们拍摄了n张不同角度的标定图片,因为每张图片我们都可以得到一组(2个)上述的等式。其中,
v
12
v_{12}
v12,
v
11
v_{11}
v11,
v
22
v_{22}
v22可以通过前面已经计算好的单应矩阵得到,因此是已知的,而b中6个元素是待求的未知数。因此,至少需要保证图片数 n>=3,我们才能解出b。
当b向量求解出来以后:
B
=
λ
M
−
T
M
B=\lambda M^{-T} M
B=λM−TM根据B展开的内容:
{
f
x
=
λ
/
B
11
f
y
=
λ
B
11
/
(
B
11
B
22
−
B
12
2
)
u
0
=
γ
v
0
/
f
y
−
B
13
f
x
2
/
λ
v
0
=
(
B
12
B
13
−
B
11
B
23
)
/
(
B
11
B
22
−
B
12
2
)
γ
=
−
B
12
f
x
2
f
y
/
λ
λ
=
B
33
−
[
B
13
2
+
v
0
(
B
12
B
13
−
B
11
B
23
)
]
/
B
11
\left\{\begin{aligned} f_{x} &=\sqrt{\lambda / B_{11}} \\ f_{y} &=\sqrt{\lambda B_{11} /\left(B_{11} B_{22}-B_{12}^{2}\right)} \\ u 0 &=\gamma v 0 / f_{y}-B_{13} f_{x}^{2} / \lambda \\ v 0 &=\left(B_{12} B_{13}-B_{11} B_{23}\right) /\left(B_{11} B_{22}-B_{12}^{2}\right) \\ \gamma &=-B_{12} f_{x}^{2} f_{y} / \lambda \\ \lambda &=B_{33}-\left[B_{13}^{2}+v 0\left(B_{12} B_{13}-B_{11} B_{23}\right)\right] / B_{11} \end{aligned}\right.
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧fxfyu0v0γλ=λ/B11=λB11/(B11B22−B122)=γv0/fy−B13fx2/λ=(B12B13−B11B23)/(B11B22−B122)=−B12fx2fy/λ=B33−[B132+v0(B12B13−B11B23)]/B11内参M已知后,也可以计算得外参:
r
1
=
λ
M
−
1
h
1
r
2
=
λ
M
−
1
h
2
r
3
=
r
1
×
r
2
t
=
λ
M
−
1
h
3
\begin{array}{ll} r_{1}=\lambda M^{-1} h_{1} & r_{2}=\lambda M^{-1} h_{2} \\ r_{3}=r_{1} \times r_{2} & t=\lambda M^{-1} h_{3} \end{array}
r1=λM−1h1r3=r1×r2r2=λM−1h2t=λM−1h3
最大似然估计
上述的推导结果是基于理想情况下的解,从理论上证明了张氏标定算法的可行性。但在实际标定过程中,一般使用最大似然估计进行优化。假设我们拍摄了n张标定图片,每张图片里有m个棋盘格角点。三维空间点
P
P
P在图片上对应的二维像素为
p
p
p,三维空间点经过相机内参
M
M
M,外参
R
R
R,
t
t
t变换后得到的二维像素为
p
′
p^{\prime}
p′(假设噪声是独立同分布的,我们通过最小化
p
p
p,
p
’
p’
p’的位置来求解上述最大似然估计问题:
∑
i
=
1
n
∑
j
=
1
m
∥
p
i
j
−
p
′
(
M
,
R
i
,
t
i
,
P
i
j
)
∥
2
\sum_{i=1}^{n} \sum_{j=1}^{m}\left\|p_{i j}-p^{\prime}\left(M, R_{i}, t_{i}, P_{ij}\right)\right\|^{2}
i=1∑nj=1∑m∥pij−p′(M,Ri,ti,Pij)∥2
考虑畸变的影响:
畸变模型为:
{
x
brown
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
brown
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
\left\{ \begin{array}{l} x_{\text{brown}}=x\left( 1+k_1r^2+k_2r^4+k_3r^6 \right)\\ y_{\text{brown}}=y\left( 1+k_1r^2+k_2r^4+k_3r^6 \right)\\ \end{array} \right.
{xbrown=x(1+k1r2+k2r4+k3r6)ybrown=y(1+k1r2+k2r4+k3r6)此时最大似然估计目标函数变为:
∑
i
=
1
n
∑
j
=
1
m
∥
p
i
j
−
p
′
(
M
,
k
1
,
k
2
,
R
i
,
t
i
,
P
i
j
)
∥
2
\sum_{i=1}^{n} \sum_{j=1}^{m}\left\|p_{i j}-p^{\prime}\left(M, k_1,k_2,R_{i}, t_{i}, P_{ij}\right)\right\|^{2}
i=1∑nj=1∑m∥pij−p′(M,k1,k2,Ri,ti,Pij)∥2