前言
OpenCV相机标定包括普通相机标定和鱼眼相机标定,其中普通相机标定参考的是张正友标定法,而鱼眼相机的标定是基于等距投影模型进行标定的.
普通相机标定
张正友标定法
(1) 针孔模型内外参标定
针孔相机投影模型方程:
s
m
~
=
A
[
R
t
]
M
~
(1)
s\widetilde{\mathbf{m}} = \mathbf{A}\begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \widetilde{M} \tag{1}
sm
=A[Rt]M
(1)
式中
M
~
\widetilde{M}
M
表示世界坐标系下三维空间点坐标,
m
~
\widetilde{\mathbf{m}}
m
表示对应的投影像素坐标,
A
\mathbf{A}
A表示相机内参,
[
R
t
]
\begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix}
[Rt]表示相机外参(世界坐标系与相机坐标系之间的坐标变换关系),
s
s
s表示任意尺度因子.
对公式(1)进行展开,可得下式:
s
[
u
v
1
]
=
A
[
r
1
r
2
r
3
t
]
[
X
Y
Z
1
]
(2)
s\begin{bmatrix} u \\ v\\ 1\end{bmatrix} = \mathbf{A}\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{r}_{3} & \mathbf{t} \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z\\ 1\end{bmatrix} \tag{2}
s⎣⎡uv1⎦⎤=A[r1r2r3t]⎣⎢⎢⎡XYZ1⎦⎥⎥⎤(2)
式中
(
r
1
,
r
2
,
r
3
)
(\mathbf{r}_{1}, \mathbf{r}_{2}, \mathbf{r}_{3})
(r1,r2,r3)表示旋转矩阵
R
\mathbf{R}
R的三个列向量.将世界坐标系定义在一块标定板上(z轴垂直与标定板平面),则标定板上任意三维空间点坐标可表示为
(
X
,
Y
,
0
)
(X, Y, 0)
(X,Y,0),基于此定义,可将公式(2)简化为:
s
[
u
v
1
]
=
A
[
r
1
r
2
t
]
[
X
Y
1
]
=
H
[
X
Y
1
]
(3)
s\begin{bmatrix} u \\ v\\ 1\end{bmatrix} = \mathbf{A}\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{bmatrix} \begin{bmatrix} X \\ Y \\ 1\end{bmatrix} = \mathbf{H}\begin{bmatrix} X \\ Y \\ 1\end{bmatrix} \tag{3}
s⎣⎡uv1⎦⎤=A[r1r2t]⎣⎡XY1⎦⎤=H⎣⎡XY1⎦⎤(3)
设
H
=
[
h
1
h
2
h
3
]
\mathbf{H}=\begin{bmatrix} \mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3} \end{bmatrix}
H=[h1h2h3],则有:
[
h
1
h
2
h
3
]
=
λ
A
[
r
1
r
2
t
]
(4)
\begin{bmatrix} \mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3} \end{bmatrix} = \lambda \mathbf{A}\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{bmatrix} \tag{4}
[h1h2h3]=λA[r1r2t](4)
将
A
\mathbf{A}
A移到公式(4)左边,有:
[
A
−
1
h
1
A
−
1
h
2
A
−
1
h
3
]
=
λ
[
r
1
r
2
t
]
(4)
\begin{bmatrix} \mathbf{A}^{-1}\mathbf{h}_{1} & \mathbf{A}^{-1}\mathbf{h}_{2} & \mathbf{A}^{-1}\mathbf{h}_{3} \end{bmatrix} = \lambda\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{bmatrix} \tag{4}
[A−1h1A−1h2A−1h3]=λ[r1r2t](4)
由于
(
r
1
,
r
2
)
(\mathbf{r}_{1},\mathbf{r}_{2})
(r1,r2)是旋转矩阵
R
\mathbf{R}
R的两个列向量,并且旋转矩阵是正定的,所以
(
r
1
,
r
2
)
(\mathbf{r}_{1},\mathbf{r}_{2})
(r1,r2)是标准正交向量组,即满足下式:
{
r
1
⋅
r
2
=
0
=
(
A
−
1
h
1
)
T
(
A
−
1
h
2
)
=
h
1
T
A
−
T
A
−
1
h
2
r
1
⋅
r
1
=
1
=
(
A
−
1
h
1
)
T
(
A
−
1
h
1
)
=
h
1
T
A
−
T
A
−
1
h
1
r
2
⋅
r
2
=
1
=
(
A
−
1
h
2
)
T
(
A
−
1
h
2
)
=
h
2
T
A
−
T
A
−
1
h
2
(5)
\left\{\begin{matrix} \mathbf{r}_{1}\cdot \mathbf{r}_{2} = 0 = (\mathbf{A}^{-1}\mathbf{h}_{1})^{T}(\mathbf{A}^{-1}\mathbf{h}_{2}) = \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2}\\ \mathbf{r}_{1}\cdot \mathbf{r}_{1} = 1 = (\mathbf{A}^{-1}\mathbf{h}_{1})^{T}(\mathbf{A}^{-1}\mathbf{h}_{1}) = \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{1} \\ \mathbf{r}_{2}\cdot \mathbf{r}_{2} = 1 = (\mathbf{A}^{-1}\mathbf{h}_{2})^{T}(\mathbf{A}^{-1}\mathbf{h}_{2}) = \mathbf{h}_{2}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2} \end{matrix}\right. \tag{5}
⎩⎨⎧r1⋅r2=0=(A−1h1)T(A−1h2)=h1TA−TA−1h2r1⋅r1=1=(A−1h1)T(A−1h1)=h1TA−TA−1h1r2⋅r2=1=(A−1h2)T(A−1h2)=h2TA−TA−1h2(5)
简化公式(5)可得:
{
h
1
T
A
−
T
A
−
1
h
2
=
0
h
1
T
A
−
T
A
−
1
h
1
=
h
2
T
A
−
T
A
−
1
h
2
(6)
\left\{\begin{matrix} \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2} = 0\\ \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{1} = \mathbf{h}_{2}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2} \end{matrix}\right. \tag{6}
{h1TA−TA−1h2=0h1TA−TA−1h1=h2TA−TA−1h2(6)
将公式(6)中的
A
−
T
A
−
1
\mathbf{A}^{-T}\mathbf{A}^{-1}
A−TA−1 看成一个整体,可以将其转换成齐次方程组
A
i
x
=
0
\mathbf{A_{i}x} = \mathbf{0}
Aix=0的形式,由于
A
−
T
A
−
1
\mathbf{A}^{-T}\mathbf{A}^{-1}
A−TA−1 的自由度为6,因此至少需要三组匹配点构成至少6个方程来求解齐次方程组中的
x
\mathbf{x}
x,对于齐次方程组的求解可利用svd方法,此处求解的详细过程是简单的数值分析的知识(略).通过多组匹配点求解出相机内参矩阵
A
\mathbf{A}
A之后,可通过下式计算出外参矩阵:
r
1
=
λ
A
−
1
h
1
r
2
=
λ
A
−
1
h
2
r
3
=
r
1
×
r
2
t
=
λ
A
−
1
h
3
(7)
\begin{aligned} \mathbf{r}_{1} &= \lambda\mathbf{A}^{-1}\mathbf{h}_{1} \\ \mathbf{r}_{2} &= \lambda\mathbf{A}^{-1}\mathbf{h}_{2} \\ \mathbf{r}_{3} &= \mathbf{r}_{1} \times \mathbf{r}_{2} \\ \mathbf{t} &= \lambda\mathbf{A}^{-1}\mathbf{h}_{3} \end{aligned} \tag{7}
r1r2r3t=λA−1h1=λA−1h2=r1×r2=λA−1h3(7)
(2) 引入畸变模型
张正友标定法中只考虑了径向畸变,其畸变方程如下:
[
(
u
−
u
0
)
(
x
2
+
y
2
)
(
u
−
u
0
)
(
x
2
+
y
2
)
2
(
v
−
v
0
)
(
x
2
+
y
2
)
(
v
−
v
0
)
(
x
2
+
y
2
)
2
]
[
k
1
k
2
]
=
[
u
ˇ
−
u
v
ˇ
−
v
]
(8)
\begin{bmatrix} (u - u_{0})(x^{2} + y^{2}) & (u - u_{0})(x^{2} + y^{2})^{2} \\ (v - v_{0})(x^{2} + y^{2}) & (v - v_{0})(x^{2} + y^{2})^{2} \end{bmatrix} \begin{bmatrix} k_{1} \\ k_{2} \end{bmatrix}= \begin{bmatrix} \check{u} - u \\ \check{v} - v \end{bmatrix} \tag{8}
[(u−u0)(x2+y2)(v−v0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)2][k1k2]=[uˇ−uvˇ−v](8)
式中
(
u
,
v
)
(u,v)
(u,v) 表示理想的通过针孔模型获得的投影像素坐标,
(
u
ˇ
,
v
ˇ
)
(\check{u},\check{v})
(uˇ,vˇ) 表示实际的投影像素坐标.通过式(8)可以看出一对配对点可以构建两个方程,因此通过多对匹配点构建超定方程,然后再通过SVD分解或者QR分解来求解构建的超定方程,从而可以获得畸变系数
(
k
1
,
k
2
)
(k_{1}, k_{2})
(k1,k2).在获得畸变系数之后可以对先前计算获得的内外参数进行精细化,其方法是通过构建重投影残差方程,然后通过优化残差获得精细化的内外参数及畸变系数,残差方程构建如下:
Σ
i
=
1
n
Σ
j
=
1
m
∥
m
i
j
−
m
ˇ
(
A
,
k
1
,
k
2
,
R
i
,
t
i
,
M
j
)
∥
2
(9)
\Sigma_{i=1}^{n}\Sigma_{j=1}^{m}\left\| \mathbf{m}_{ij} - \check{\mathbf{m}}(\mathbf{A},k_{1},k_{2},\mathbf{R}_{i}, \mathbf{t}_{i}, \mathbf{M}_{j}) \right\|^{2} \tag{9}
Σi=1nΣj=1m∥mij−mˇ(A,k1,k2,Ri,ti,Mj)∥2(9)
式中
m
i
j
\mathbf{m}_{ij}
mij 表示世界坐标系下的点
M
j
\mathbf{M}_{j}
Mj 在第
j
j
j张图像上的投影点,
m
ˇ
\check{\mathbf{m}}
mˇ 表示通过内外餐及畸变系数计算出的投影点坐标.上述方程组是非线性方程组,可通过高斯牛顿或LM方法进行迭代求解,至此实现了相机的所有参数的标记: 内参、外参、畸变系数.
(3) 标定流程
- 打印标定板并粘贴到平面上
- 在相机镜头前移动标定板获取几张照片
- 检测图像中的特征点(标定板角点)
- 使用公式(6)构建的方程组计算相机内参和外参
- 使用公式(8)计算相机畸变
- 使用公式(9)对相机内外参和畸变系数进行进一步精细化.
OpenCV标定算法
OpenCV对于普通相机的标定方法基本上与张正友标定法一致,只是其考虑了相机的径向畸变和桶形畸变,分别如下:
径向畸变:
桶形畸变:
因此其畸变参数为
(
k
1
,
k
2
,
p
1
,
p
2
,
p
3
)
(k_{1}, k_{2}, p_{1}, p_{2}, p_{3})
(k1,k2,p1,p2,p3). 其余参数和流程与张正友标定一致.
鱼眼相机标定
OpenCV中将鱼眼相机区分开进行标定,原因是等距投影模型更能真实的刻画鱼眼相机的投影过程,其投影方程如下:
上面公式中
X
\mathbf{X}
X表示世界坐标系下的三维点,
(
R
,
t
)
(\mathbf{R}, \mathbf{t})
(R,t)表示相机外参,
X
c
\mathbf{X}_{c}
Xc表示相机坐标系下的三维点,
(
u
,
v
)
(u, v)
(u,v)为投影的像素坐标.该投影模型与普通相机的投影模型相比反而更简单,其标定的参数包括相机内参
(
f
x
,
f
y
,
c
x
,
c
y
)
(f_{x}, f_{y}, c_{x}, c_{y})
(fx,fy,cx,cy),外参
(
R
,
t
)
(\mathbf{R}, \mathbf{t})
(R,t),以及畸变系数
(
k
1
,
k
2
,
k
3
,
k
4
)
(k1, k2, k3, k4)
(k1,k2,k3,k4).标定的过程与普通相机的标定过程基本一致,只是投影模型不一样而已,最后也是构建重投影残差方程,然后优化方程获取相机的内外参及畸变系数.
标定程序
https://github.com/chennuo0125-HIT/opencv_demo/tree/master/calibrate