文章目录
  1. 1. 摄像机模型
    1. 1.1. 针孔相机模型
    2. 1.2. 畸变模型
      1. 1.2.1. Division模型
      2. 1.2.2. 多项式模型
        1. 1.2.2.1. 径向畸变
        2. 1.2.2.2. 切向畸变
  2. 2. 标定过程
  3. 3. 参考文献

摄像机标定是3D计算机视觉从2D图像中获取世界坐标必不可少的一个步骤。每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变。另外标定后就可以得到世界坐标系中目标物体的米制单位的坐标,例如多少米或多少毫米。

摄像机模型

为了标定摄像机,我们有必要建立一个模型,该模型由摄像机、镜头和图像采集卡组成,这个模型可以将世界坐标系中三维空间点投影到二维图像中。再机器视觉应用中常用的有两种不同类型镜头:普通镜头和远心镜头。使用普通镜头时,世界坐标系到图像坐标系的投影为透视变换,这种模型称为针孔摄像机模型。远心镜头实现世界坐标系到图像坐标系的平行投影,称为远心摄像机模型

我们上面讲的通常是面阵图像传感器,对于线阵图像传感器,一般搭配普通摄像机,这种模型称为线扫摄像机模型

针孔相机模型




针孔摄像机几何. C是摄像机中心而p是主点。这里的摄像机中心位于坐标原点.注意图像平面位于摄像机中心之前.


我们考虑空间点到一张平面上的中心投影。令摄影中心位于坐标原点,平面 $Z = -f$ 为聚焦平面(f 为相机焦距),空间坐标 $P_w = (X_w, Y_w, Z_w)$。为了让所有的坐标都为正,我们让聚焦平面对称到 $Z = f$。根据相似三角形,很快算出点$(X_w, Y_w, Z_w)$被映射为$(fX_w/Z_w, fY_w/Z_w, f)$。由于图像平面的坐标原点一般不在主点上,因此实际映射为$(fX_w/Z_w + c_x, fY_w/Z_w + c_y, f)$。注意这里映射后点的坐标实际上还是米制单位,我们需要把它转化为像素单位:$(fs_x \frac{X_w}{Z_w} + c_x, fs_y \frac{Y_w}{Z_w} + c_y, f)$。这里$s_x$, $s_y$单位为像素/毫米,表示x, y方向每毫米有多少个像素。使用矩阵形式表示为:用矩阵的形式表示为:

$$
w\begin{pmatrix} x \\ y \\ 1 \\ \end{pmatrix} =
\begin{pmatrix} f_x & & c_x \\ & f_y & c_y \\ & & 1 \\ \end{pmatrix}
\begin{pmatrix} X_w \\ Y_w \\ Z_w \\ \end{pmatrix}
\tag{1}
$$

这里$f_x = fs_x, f_y = fs_y$。

一般,空间点采用不同的欧式坐标系表示,称为世界坐标系,两个坐标系通过旋转和平移相联系。对任意世界坐标系下的空间点$\tilde{P_w}$,将其变换到摄像机坐标系中$\tilde{P_c}$:$P_c = R P_w + T$。其中,$T = (t_x, t_y, t_z)$是一个平移向量,$R = R(\alpha, \beta, \gamma)$是一个旋转矩阵,这个矩阵由三个旋转角度确定,分别是绕摄像机坐标系z轴旋转角度$\gamma$, 绕y轴旋转角度$\beta$, 绕x轴旋转角度$\alpha$:

$$
R(\alpha, \beta, \gamma) =
\begin{pmatrix} 1 & 0 & 0 \\ 0 & cos\alpha & -sin\alpha \\ 0 & sin\alpha & cos\alpha \\ \end{pmatrix}
\begin{pmatrix} cos\beta & 0 & sin\beta \\ 0 & 1 & 0 \\ -sin\beta & 0 & cos\beta \\ \end{pmatrix}
\begin{pmatrix} cos\gamma & -sin\gamma & 0 \\ sin\gamma & cos\gamma & 0 \\ 0 & 0 & 1 \\ \end{pmatrix}
\tag{2}
$$

将上述两个公式结合起来就是:
$$
w\begin{pmatrix} x \\ y \\ 1 \\ \end{pmatrix} =
A\left[
\begin{array}{c|c}
R & T
\end{array}
\right]
\begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{pmatrix}
\tag{3}
$$

我们称$f, s_x, s_y, c_x, c_y$为摄像机的内参,$\alpha, \beta, \gamma, t_x, t_y, t_z$为摄像机外参。

畸变模型

实际的摄像机模型无法达到理想的针孔模型,整个模型会引入畸变。关于畸变模型的建立已超出本文讨论范围,有兴趣可参看文献[5],[6]。以下简单介绍几种畸变模型的数学表达。

Division模型

$$
\begin{pmatrix} \tilde{u} \\ \tilde{v} \\ \end{pmatrix} =
\frac{2}{1+\sqrt{1-4k(u^2+v^2)}}
\begin{pmatrix} u \\ v \\ \end{pmatrix}
\tag{4}
$$
其中,$u, v$为空间点投影到图像平面后的坐标,$\tilde{u}, \tilde{v}$为畸变坐标。参数$k$表示了径向畸变量级,如果$k$是负值,畸变为桶形畸变。如果$k$是正值,畸变为枕形畸变。

上述模型几乎可以表示所有机器视觉应用中常用镜头的畸变,并且足够准确。另外,和其他模型相比,上述模型有一个极大的优点就是可以通过下式进行畸变校正:
$$
\begin{pmatrix} u \\ v \\ \end{pmatrix} =
\frac{1}{1+k(\tilde{u}^2+\tilde{v}^2)}
\begin{pmatrix} \tilde{u} \\ \tilde{v} \\ \end{pmatrix}
\tag{5}
$$
这在使用图像坐标计算世界坐标的过程中非常重要。

多项式模型

径向畸变

$$
\tilde{u} = u\frac{1+k_1r^2+k_2r^4+k_3r^6}{1+k_4r^2+k_5r^4+k_6r^6} \\
\tilde{v} = v\frac{1+k_1r^2+k_2r^4+k_3r^6}{1+k_4r^2+k_5r^4+k_6r^6} \\
r^2 = u^2 + v^2
\tag{6}
$$
$k_1, k_2, k_3, k_4, k_5, k_6$是径向畸变系数。

切向畸变

$$
\tilde{u} = u + [2p_1uv + p_2(r^2+2u^2)] \\
\tilde{v} = v + [2p_2xy + p_1(r^2+2v^2)] \\
r^2 = u^2 + v^2
\tag{7}
$$
$p_1, p_2$是切向畸变系数。

相机的畸变系数也是内参的一部分。

标定过程

以上只是建立了普通镜头面阵相机的数学模型,我们接下来要做的就是确定摄像机内参以及外参。为了进行摄像机标定,必须已知世界系中足够多三维空间点的坐标,找到这些空间点在图像中的投影点的二维图像坐标,并建立对应关系。关于确定对应关系可以参考另一篇博客findCirclesGrid源码分析

相机标定的方法已经有大量的研究,一般可以分为两类:基于特定的实验条件,如形状、尺寸已知的标定物,利用一系列数学变换和计算方法,求取内参外参。另一种称为自标定,不依赖于标定参照物,仅利用摄像机在运动过程中周围环境的图像与图像之间的对应关系对摄像机进行标定。下面大致介绍下Zhengyou Zhang的标定方法[4]。

Zhang的方法只需要相机在不同角度对一个平面标定板采集至少2张图像。这种方法相对于其他方法非常灵活,道具制作简单,常见的标定板可以是棋盘格,也可以是圆形网格。

由上面的针孔模型,有:
$$
w\begin{pmatrix} x \\ y \\ 1 \\ \end{pmatrix} =
A\begin{bmatrix} r_1 & r_2 & r_3 & t \\ \end{bmatrix}
\begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{pmatrix}
\tag{8}
$$

不妨假设标定板所处的平面为$Z_w = 0$,有:
$$
w\begin{pmatrix} x \\ y \\ 1 \\ \end{pmatrix} =
A\begin{bmatrix} r_1 & r_2 & t \\ \end{bmatrix}
\begin{pmatrix} X_w \\ Y_w \\ 1 \\ \end{pmatrix}
\tag{9}
$$
令$\tilde{M} = \begin{bmatrix} X_w & Y_w & 1 \\ \end{bmatrix}^T$, $\tilde{m} = \begin{bmatrix} x & y & 1 \\ \end{bmatrix}^T$, 有:
$$
w\tilde{m} = H\tilde(M), \quad with \quad H = A\begin{bmatrix} r_1 & r_2 & t \\ \end{bmatrix}
\tag{10}
$$
令$H = \begin{bmatrix} h_1 & h_2 & h_3 \\ \end{bmatrix}$, 我们有:
$$
\begin{bmatrix} h_1 & h_2 & h_3 \\ \end{bmatrix} =
\lambda A \begin{bmatrix} r_1 & r_2 & t \\ \end{bmatrix}
\tag{11}
$$
分解方程得到:
$$
h_1 = \lambda A r_1, \quad r_1 = sA^{-1} h_1 \\
h_2 = \lambda A r_2, \quad r_2 = sA^{-1} h_2
\tag{12}
$$
这里$s = \frac{1}{\lambda}$。

由于$r_1, r_2$正交,有
$$
r_1^T r_2 = 0 \\
\begin{Vmatrix} r_1 \end{Vmatrix} = \begin{Vmatrix} r_2 \end{Vmatrix}
\tag{13}
$$
代入(13)有:
$$
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
\tag{14}
$$


$$
B = A^{-T}A =
\begin{pmatrix} B_11 & B_12 & B_13 \\ B_12 & B_22 & B_23 \\ B_13 & B_23 & B_33 \end{pmatrix}
$$

$B$为对称矩阵,约束(14)有通用形式$h_i^T B h_j$。将矩阵乘开后有:

约束(14)可表示为:


如果我们同时得到n个标定图像,堆叠这些方程有:
$$
Vb = 0
$$
其中V是2nx6的矩阵。如果n>=2, 那么方程有解。如果n=1, 我们只能计算相机的两个内参$f_x, f_y$, 此时假设$c_x, c_y$为图像的中心点。实际上,在OpenCV的实现中,获取初始的内参值就是这么做的。如果&b&可以解出,摄像机内参可以通过如下公式给出:

一旦内参矩阵A给出了,外参也可以算出来:
$$
r_1 = \lambda A^{-1} h_1 \\
r_2 = \lambda A^{-1} h_2 \\
r_3 = r_1 X r_2 \\
with \quad \lambda =
\frac{1} {\begin{Vmatrix} A^{-1}h_1 \end{Vmatrix}} =
\frac{1} {\begin{Vmatrix} A^{-1}h_2 \end{Vmatrix}}
$$

上述的解决方案只是最小化代数距离,并没有什么物理意义。假设我们有n个图像,每张图像上m个点。可以通过最小化下面方程来获取极大似然估计:

其中,$\hat{m}(A, k_1, k_2, R_i, t_i, M_j)$将空间点$M_j$按照(3)变换到图像坐标系,同时要考虑畸变带来的影响。这是一个非线性最小化问题,可以通过Levenberg-Marqurdt算法解决[7]。

参考文献

[1]Hartley R, Zisserman A. Multiple view geometry in computer vision[M]. Cambridge university press, 2003.
中文版:计算机视觉中的多视图几何
[2]Steger C, Ulrich M, Wiedemann C. Machine vision algorithms and applications[J]. Illumination, 2008, 5(2.1): 1.
中文版:机器视觉算法与应用
[3]Bradski G, Kaehler A. Learning OpenCV: Computer vision with the OpenCV library[M]. “ O’Reilly Media, Inc.”, 2008.
中文版:学习OpenCV
[4]Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on pattern analysis and machine intelligence, 2000, 22(11): 1330-1334.
[5]Lenz R, Fritsch D. Accuracy of videometry with CCD sensors[J]. ISPRS Journal of Photogrammetry and Remote Sensing, 1990, 45(2): 90-110.
[6]Duane C B. Close-range camera calibration[J]. Photogramm. Eng, 1971, 37(8): 855-866.
[7]Moré J J. The Levenberg-Marquardt algorithm: implementation and theory[M]//Numerical analysis. Springer Berlin Heidelberg, 1978: 105-116.

文章目录
  1. 1. 摄像机模型
    1. 1.1. 针孔相机模型
    2. 1.2. 畸变模型
      1. 1.2.1. Division模型
      2. 1.2.2. 多项式模型
        1. 1.2.2.1. 径向畸变
        2. 1.2.2.2. 切向畸变
  2. 2. 标定过程
  3. 3. 参考文献