赞
踩
张正友标定法是一种求解相机内外参的标定方法。相比使用三维标定板的标定方法,张正友标定法使用二维平面标定板,优点是标定板制作成本低,应用更为灵活,但缺点是需要拍摄多张不同姿态的标定板图像(PS:也可以在一张图片中同时拍摄多个不同姿态的标定板),效率上总体不如三维标定板标定方法。
本文介绍张正友标定法的数学原理,并给出代码实现。数学原理方面,介绍了相机模型,对单应矩阵、内参矩阵、外参矩阵的求解做了详细解释,但内容上为了更为简洁实用,省略skewness参数以及畸变参数的估计,原因如下:
代码实现上,调用OpenCV实现图片读取与特征点提取,手写函数实现单应、内参、外参初值估计,最后调用Ceres创建目标函数并优化求解,并与OpenCV calibrateCamera()函数进行标定结果对比。代码地址:https://github.com/zxcn/zhangzy_single_camera_calibration.git
相机模型表征了三维世界坐标系或物体坐标系中的点,如何经过镜头和图像传感器成像,映射为二维像素坐标的过程。相机模型的关键参数是内参和外参,内参包括主点、焦距、畸变参数,外参包括每幅图像中标定板在相机坐标系的旋转和平移参数。计算机视觉中常用的相机模型是“针孔+畸变”相机模型。OpenCV有对相机模型的详细介绍,本节仅简要介绍其中的重点内容。
相机标定的目的是找到最小化如下目标函数的相机参数 min K , D , R i , t i ∑ i ∑ j ( U i , j − cam ( R i P i , j + t i ) ) 2 \min_{K,D,R_i,t_i} \sum_i\sum_j(U_{i,j}-\text{cam}(R_iP_{i,j}+t_i))^2 K,D,Ri,timini∑j∑(Ui,j−cam(RiPi,j+ti))2其中, i i i表示标定板姿态的索引, j j j表示标定板中特征点的索引, cam ( ) \text{cam}() cam()表示相机对相机坐标系中的3D点的成像过程,包含了透视投影、畸变模型、像素采样。
相机标定过程中的已知量为:
需要求解的未知量为:
目标函数需要通过迭代进行求解,常用的迭代方法是L-M法,但由于畸变函数比较复杂,雅可比矩阵解析形式太复杂,不好实现,但好在有很多非线性优化库提供了自动求导和数值求导方法,本文的程序调用Ceres实现目标函数构造与求解。
同时,迭代需要提供好的初值参数才能正确收敛。通常采用的方法是在忽略畸变的情况下使用解析的方法求解内参(主点
c
x
,
c
y
c_x,c_y
cx,cy、焦距
f
x
,
f
y
f_x,f_y
fx,fy)和外参(
R
i
,
t
i
R_i,t_i
Ri,ti),以此为初值进行迭代优化。根据标定板特征点的维度(在三维空间中、在二维平面上、在一维线上),有几类不同的解析求解方法【1】。本文介绍的是张正友提出的基于二维平面标定板的解析求解方法【2,3】。
无畸变情况下,相机模型表示为:
[
u
v
1
]
⋍
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
r
11
r
12
r
13
t
1
r
21
r
22
r
23
t
2
r
31
r
32
r
33
t
3
]
[
X
Y
Z
1
]
假定标定平面位于物体坐标系中
Z
=
0
Z=0
Z=0的平面上,对上述公式进行简化,得
[
u
v
1
]
⋍
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
r
11
r
12
r
13
t
1
r
21
r
22
r
23
t
2
r
31
r
32
r
33
t
3
]
[
X
Y
0
1
]
[
u
v
1
]
⋍
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
r
11
r
12
t
1
r
21
r
22
t
2
r
31
r
32
t
3
]
[
X
Y
1
]
u
=
h
11
X
+
h
12
Y
+
h
13
h
31
X
+
h
32
Y
+
h
33
v
=
h
21
X
+
h
22
Y
+
h
23
h
31
X
+
h
32
Y
+
h
33
1
=
h
31
X
+
h
32
Y
+
h
33
h
31
X
+
h
32
Y
+
h
33
u = \frac{h_{11}X+h_{12}Y+h_{13}}{h_{31}X+h_{32}Y+h_{33}}\\ v = \frac{h_{21}X+h_{22}Y+h_{23}}{h_{31}X+h_{32}Y+h_{33}}\\ 1 = \frac{h_{31}X+h_{32}Y+h_{33}}{h_{31}X+h_{32}Y+h_{33}}
u=h31X+h32Y+h33h11X+h12Y+h13v=h31X+h32Y+h33h21X+h22Y+h231=h31X+h32Y+h33h31X+h32Y+h33
对前两个等式进行变换,可得
h
11
X
+
h
12
Y
+
h
13
−
u
(
h
31
X
+
h
32
Y
+
h
33
)
=
0
h
21
X
+
h
22
Y
+
h
23
−
v
(
h
31
X
+
h
32
Y
+
h
33
)
=
0
h_{11}X+h_{12}Y+h_{13}-u(h_{31}X+h_{32}Y+h_{33})=0\\h_{21}X+h_{22}Y+h_{23}-v(h_{31}X+h_{32}Y+h_{33})=0
h11X+h12Y+h13−u(h31X+h32Y+h33)=0h21X+h22Y+h23−v(h31X+h32Y+h33)=0写成矩阵形式为
[
X
Y
1
0
0
0
−
u
X
−
u
Y
−
u
0
0
0
X
Y
1
−
v
X
−
v
Y
−
v
]
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
=
0
(1)
虽然
h
h
h有九个未知数,但矩阵元素乘以任意非零常数后,等式仍然成立,因此
h
h
h的自由度实际只有8。只要找到任意三点不共线的四个点,提供八组约束方程就能求解,实际标定板的特征点数更多,多出来的约束可以用最小二乘法求解。这里求解的是
A
x
=
0
Ax=0
Ax=0问题的最小二乘解,目标函数为
min
∣
∣
A
x
∣
∣
2
2
\min ||Ax||^2_2
min∣∣Ax∣∣22,求解时需固定
x
x
x的尺度,满足
∣
∣
x
∣
∣
2
2
=
1
||x||^2_2=1
∣∣x∣∣22=1,否则
x
x
x模长越接近0,目标函数越小,得不到有效解。下面给出了有关
A
x
=
0
Ax=0
Ax=0求解的总结。
A x = 0 Ax=0 Ax=0的求解
欠定
非零解的数量取决于矩阵 A A A的秩,若 x x x维度为 n n n,非零解的个数为 n − R a n k ( A ) n-Rank(A) n−Rank(A)。
超定
超定情况下求解满足单位长度约束下的最小二乘问题
min ∣ ∣ A x ∣ ∣ 2 2 subject to ∣ ∣ x ∣ ∣ 2 2 = 1 \min ||Ax||^2_2\\\text{subject to }||x||^2_2=1 min∣∣Ax∣∣22subject to ∣∣x∣∣22=1构造拉格朗日函数 min L ( x , λ ) = ∣ ∣ A x ∣ ∣ 2 2 + λ ( 1 − ∣ ∣ x ∣ ∣ 2 2 ) \min L(x,\lambda)=||Ax||^2_2+\lambda(1-||x||^2_2) minL(x,λ)=∣∣Ax∣∣22+λ(1−∣∣x∣∣22)目标函数 L L L关于 x x x和 λ \lambda λ的偏导数为零 { ∂ L ∂ x = A T A x − λ x = 0 ∂ L ∂ λ = 1 − ∣ ∣ x ∣ ∣ 2 2 = 0{∂x∂L=ATAx−λx=0∂λ∂L=1−∣∣x∣∣22=0可得 A T A x = λ x A^TAx=\lambda x ATAx=λx,解是 A T A A^TA ATA的单位特征向量。当 x x x为 A T A A^TA ATA单位特征向量时,有 ∣ ∣ A x ∣ ∣ 2 2 = x T A T A x = x T λ x = λ ||Ax||^2_2=x^TA^TAx=x^T\lambda x=\lambda ∣∣Ax∣∣22=xTATAx=xTλx=λ。因此,要想使 ∣ ∣ A x ∣ ∣ 2 2 ||Ax||^2_2 ∣∣Ax∣∣22最小, x x x应取 A T A A^TA ATA最小特征值对应的单位特征向量,或者 A A A矩阵的SVD分解最小奇异值对应的 V V V矩阵的列向量(或者 V T V^T VT的行向量)。{∂L∂x=ATAx−λx=0∂L∂λ=1−||x||22=0
在OpenCV里,可以使用函数SVD::solveZ得到
A
x
=
0
Ax=0
Ax=0满足
∣
∣
x
∣
∣
2
2
=
1
||x||^2_2=1
∣∣x∣∣22=1的解。注意这里求解得到的单应矩阵与内参矩阵和旋转平移矩阵的乘积差一个未知的尺度参数
λ
\lambda
λ,表示为
λ
h
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
r
11
r
12
t
1
r
21
r
22
t
2
r
31
r
32
t
3
]
\lambda h=
在求解单应矩阵时,对
[
X
,
Y
,
1
]
T
[X,Y,1]^T
[X,Y,1]T和
[
u
,
v
,
1
]
T
[u,v,1]^T
[u,v,1]T进行归一化处理可提高单应矩阵
h
h
h求解的稳定性。对
[
X
,
Y
,
1
]
T
[X,Y,1]^T
[X,Y,1]T的归一化处理表示如下
[
X
ˉ
Y
ˉ
1
]
=
N
P
[
X
Y
1
]
=
[
1
X
std
0
−
X
mean
X
std
0
1
Y
std
−
Y
mean
Y
std
0
0
1
]
[
X
Y
1
]
(2)
带入归一化的坐标,求解单应矩阵
h
′
h'
h′
[
X
ˉ
Y
ˉ
1
0
0
0
−
u
ˉ
X
ˉ
−
u
ˉ
Y
ˉ
−
u
ˉ
0
0
0
X
ˉ
Y
ˉ
1
−
v
ˉ
X
ˉ
−
v
ˉ
Y
ˉ
−
v
ˉ
]
[
h
11
′
h
12
′
h
13
′
h
21
′
h
22
′
h
23
′
h
31
′
h
32
′
h
33
′
]
=
0
h
=
inv
(
N
U
)
⋅
h
′
⋅
N
P
(3)
h=\text{inv}(N_U)\cdot h'\cdot N_P\tag{3}
h=inv(NU)⋅h′⋅NP(3)
求解完单应矩阵后,可以利用旋转矩阵的单位正交性从单应矩阵中恢复内参。
r
1
=
λ
K
−
1
h
1
r
2
=
λ
K
−
1
h
2
r
1
T
r
2
=
0
r
1
T
r
1
−
r
2
T
r
2
=
0
⇓
h
1
T
K
−
T
K
−
1
h
2
=
0
h
1
T
K
−
T
K
−
1
h
1
−
h
2
T
K
−
T
K
−
1
h
2
=
0
r_1 = \lambda K^{-1}h_1\\r_2 = \lambda K^{-1}h_2\\r_1^Tr_2=0\\r_1^Tr_1-r_2^Tr_2=0\\\Downarrow\\h_1^TK^{-T}K^{-1}h_2=0\\h_1^TK^{-T}K^{-1}h_1-h_2^TK^{-T}K^{-1}h_2=0
r1=λK−1h1r2=λK−1h2r1Tr2=0r1Tr1−r2Tr2=0⇓h1TK−TK−1h2=0h1TK−TK−1h1−h2TK−TK−1h2=0由于是两个等于0的等式,求解并不涉及未知尺度
λ
\lambda
λ。令
B
=
K
−
T
K
−
1
B=K^{-T}K^{-1}
B=K−TK−1,则有
B
=
K
−
T
K
−
1
⇔
[
B
11
0
B
13
0
B
22
B
23
B
13
B
23
B
33
]
=
[
1
f
x
2
0
−
c
x
f
x
2
0
1
f
y
2
−
c
y
f
y
2
−
c
x
f
x
2
−
c
y
f
y
2
1
+
c
x
2
f
x
2
+
c
y
2
f
y
2
]
B=K^{-T}K^{-1}\Harr
[
B
11
0
B
13
0
B
22
B
23
B
13
B
23
B
33
]
=
η
[
1
f
x
2
0
−
c
x
f
x
2
0
1
f
y
2
−
c
y
f
y
2
−
c
x
f
x
2
−
c
y
f
y
2
1
+
c
x
2
f
x
2
+
c
y
2
f
y
2
]
{
η
f
x
2
=
B
11
η
f
y
2
=
B
22
−
η
c
x
f
x
2
=
B
13
−
η
c
y
f
y
2
=
B
23
η
(
1
+
c
x
2
f
x
2
+
c
y
2
f
y
2
)
=
B
33
⇔
{
c
x
=
−
B
13
B
11
c
y
=
−
B
23
B
22
η
=
B
33
−
B
13
2
B
11
−
B
23
2
B
22
f
x
=
η
B
11
f
y
=
η
B
22
(5)
得到内参之后,因
λ
[
h
1
h
2
h
3
]
=
K
[
r
1
r
2
t
]
\lambda
r
1
=
λ
K
−
1
h
1
r
2
=
λ
K
−
1
h
2
t
=
λ
K
−
1
h
3
r
3
=
r
1
×
r
2
(6)
r_1 = \lambda K^{-1}h_1\\ r_2 = \lambda K^{-1}h_2\\ t = \lambda K^{-1}h_3\\ r_3 = r_1\times r_2\tag{6}
r1=λK−1h1r2=λK−1h2t=λK−1h3r3=r1×r2(6)其中,利用
r
1
T
r
1
=
r
2
T
r
2
=
1
r_1^Tr_1=r_2^Tr_2=1
r1Tr1=r2Tr2=1的性质,可得
λ
=
1
/
∣
∣
K
−
1
h
1
∣
∣
2
=
1
/
∣
∣
K
−
1
h
2
∣
∣
2
\lambda = 1/||K^{-1}h_1||_2=1/||K^{-1}h_2||_2
λ=1/∣∣K−1h1∣∣2=1/∣∣K−1h2∣∣2。
这里还需要注意,单应矩阵的正负号会导致外参有两种相反的结果。但是,由于所有特征点都需要在相机前方才可以被观测到,故可以用其中一个特征点的经过外参变换后 Z Z Z值的正负号做检验。一个简单的方法是,假定标定板原点的齐次坐标 [ 0 , 0 , 0 , 1 ] T [0,0,0,1]^T [0,0,0,1]T在相机前,则有 t 3 > 0 t_3>0 t3>0,经过内参矩阵变换后,单应矩阵应满足 h 33 > 0 h_{33}>0 h33>0,因此求解单应矩阵后,可将结果直接除以 h 33 h_{33} h33做归一化,以消除另一组错误的外参。
另外,由于噪声的影响,求得的旋转矩阵
R
=
[
r
1
r
2
r
3
]
R=
[
U
,
Σ
,
V
]
=
SVD
(
R
)
R
=
U
V
T
(7)
[U,\Sigma,V] = \text{SVD}(R)\\R=UV^T\tag{7}
[U,Σ,V]=SVD(R)R=UVT(7)证明如下:
找到矩阵 M M M最接近的旋转矩阵 R R R,定义如下优化问题 min ∣ ∣ M − R ∣ ∣ F 2 = trace ( ( M − R ) T ( M − R ) ) subject to R T R = I , det ( R ) = 1 \min ||M-R||^2_F = \text{trace}((M-R)^T(M-R))\\\text{subject to }R^TR=I,\det(R)=1 min∣∣M−R∣∣F2=trace((M−R)T(M−R))subject to RTR=I,det(R)=1使用拉格朗日乘子法,定义 L ( R , Λ ) = trace ( ( M − R ) T ( M − R ) ) + trace ( Λ ( R T R − I ) ) L(R,\Lambda)=\text{trace}((M-R)^T(M-R))+\text{trace}(\Lambda(R^TR-I)) L(R,Λ)=trace((M−R)T(M−R))+trace(Λ(RTR−I))求偏导可得
∂ L ∂ R = − 2 ( M − R ) + R ( Λ + Λ T ) = 0 \frac{\partial L}{\partial R}=-2(M-R)+R(\Lambda+\Lambda^T)=0 ∂R∂L=−2(M−R)+R(Λ+ΛT)=0因为 Λ = Λ T \Lambda = \Lambda^T Λ=ΛT,可得 M = R ( I + Λ ) M = R(I+\Lambda) M=R(I+Λ)注意到 M T M = ( I + Λ ) T R T R ( I + Λ ) = ( I + Λ ) 2 M^TM = (I+\Lambda)^TR^TR(I+\Lambda)=(I+\Lambda)^2 MTM=(I+Λ)TRTR(I+Λ)=(I+Λ)2故有 I + Λ = ( M T M ) 1 / 2 I+\Lambda = (M^TM)^{1/2} I+Λ=(MTM)1/2综上可得 R = M ( M T M ) − 1 / 2 R=M(M^TM)^{-1/2} R=M(MTM)−1/2
定义矩阵 M M M的SVD分解,表示为 M = U Σ V T M=U\Sigma V^T M=UΣVT,则有 R = U Σ V T ( V Σ T U T U Σ V T ) − 1 / 2 = U Σ V T ( V Σ 2 V T ) − 1 / 2 = U Σ V T ( V Σ V T V Σ V T ) − 1 / 2 = U Σ V T ( V Σ V T ) − 1 = U Σ V T V − T Σ − 1 V − 1 = U V T R=U\Sigma V^T(V\Sigma^TU^TU\Sigma V^T)^{-1/2}\\=U\Sigma V^T(V\Sigma ^2V^T)^{-1/2}\\=U\Sigma V^T(V\Sigma V^TV\Sigma V^T)^{-1/2}\\=U\Sigma V^T(V\Sigma V^T)^{-1}\\=U\Sigma V^TV^{-T}\Sigma^{-1}V^{-1}\\=UV^T R=UΣVT(VΣTUTUΣVT)−1/2=UΣVT(VΣ2VT)−1/2=UΣVT(VΣVTVΣVT)−1/2=UΣVT(VΣVT)−1=UΣVTV−TΣ−1V−1=UVT
代码比较简单,为了方便阅读,没有用类而是用几个函数实现了张正友单相机标定。调用OpenCV实现图片读取与特征点提取,手写函数实现单应、内参、外参初值估计,最后调用Ceres创建目标函数并优化求解,和OpenCV calibrateCamera()对比了结果和重投影误差。
程序依赖OpenCV和Ceres,Windows下可使用微软的包管理软件VCPKG安装。Ceres的安装可以参考【Windows通过VCPKG配置Ceres环境】。
代码地址:https://github.com/zxcn/zhangzy_single_camera_calibration.git
程序流程:读取图片–>提取角点–>计算单应–>估计内参–>估计外参–>非线性优化–>计算重投影误差
结果对比:
【1】Chapter 2 CAMERA CALIBRATION Zhengyou Zhang
【2】Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on pattern analysis and machine intelligence, 2000, 22(11): 1330-1334.
【3】Burger W. Zhang’s camera calibration algorithm: in-depth tutorial and implementation[J]. HGB16-05, 2016: 1-6.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。