1 针孔相机模型
针孔相机是一种没有镜头、只有一个小孔的简单相机。光线通过这个小孔,在相机对面的位置形成倒立的图像。为了后续处理更加简单,我们先想象一个虚拟的图像平面,它位于相机前面,包含场景的直立图像。
图1.1 针孔相机成像
从图1.1可以看出,在针孔相机模型中,现实 3D 世界的任一点、其在成像平面上的投影点、相机中心在一条直线上,这种特征称为中心投影或者透视投影,也是做成像分析的基础。透视投影将三维空间投影到二维平面上,是一种降秩空间透射变换(三维空间降成了二维空间)。
1.1 坐标系
事实上,无论是 3D 世界点,还是其投影到成像平面中的点,都可以以坐标的形式表达,而既然涉及到坐标,则离不开坐标系的构建。
图1.2 针孔相机模型坐标系
1.1.1 像素坐标系
在一般的图像处理中,对于一张图片,我们认为它由若干个离散的像素点组成,通常在以图像左上角为原点,图像上边缘为水平轴 \vec u,图像左边缘为竖直轴 \vec v 建立像素坐标系,这样一来每一个像素点都可以用坐标 (u,v) 来描述自己在像素空间的位置。
1.1.2 图像坐标系
我们已经知道,像素坐标系中的各个像素点在针孔相机模型中,本质是 3D 世界中目标点的投影,像素点显然是以像素为单位的。为了构建与物理世界的联系,在图像中,一般还可以以物理尺寸为单位建立一个坐标系,也即图像坐标系。
图像坐标系的水平轴 \vec x 与像素坐标系的 \vec u 轴平行,竖直轴 \vec y 与像素坐标系的 \vec v 轴平行,原点一般位于图像主点(主点是摄影中心到成像平面的垂点)。图像坐标系通常与像素坐标系共面,因此原点可以在像素坐标系中表达为 O(u_0, v_0)。当已知单个像素的物理尺寸时,点在像素坐标系和图像坐标系之间可以转换:
u - u_0 = x / d_x \\
v - v_0 = y / d_y
\tag{1.1}
其中 d_x 和 d_y 分别表示像素在 \vec x 方向和 \vec y 方向的物理尺寸。公式 (1.1) 可以写成矩阵形式:
\begin{bmatrix}
u \\ v \\ 1
\end{bmatrix}
=
\begin{bmatrix}
1/d_x & 0 & u_0 \\
0 & 1/d_y & v_0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x \\ y \\ 1
\end{bmatrix}
\tag{1.2}
1.1.3 相机坐标系
如图1.2所示,像素坐标系和图像坐标系均为二维坐标系,相机坐标系为三维坐标系,它的作用是将 3D 世界坐标系和图像坐标系联系起来。相机坐标系一般以相机中心为原点,水平轴 \vec x_c 和竖直轴 \vec y_c 分别与图像坐标系的 \vec x 轴和 \vec y 轴平行,\vec z_c 轴则垂直于像平面并且朝向像平面。
\vec z_c 轴与像平面的交点即为与图像坐标系原点重叠的主点。
按照上述方式建立相机坐标系后,像平面上的所有像素点在相机坐标系下的 \vec z_c 坐标均等于焦距 f。设图像中有像素点 p,它在图像坐标系中的坐标为 (x, y),那么点 p 在相机坐标系下的坐标即为 (x, y, f)。
在针孔相机模型中,像素点 p 是 3D 世界中目标点的投影,如果该点在相机坐标系下的坐标 (x_c, y_c, z_c),那么如图1所示,利用相似三角形原理,可以得到如下关系:
\frac{x}{x_c} = \frac{y}{y_c} = \frac{f}{z_c} \tag{1.3}
写成矩阵形式为:
\begin{bmatrix}
x \\ y \\ 1
\end{bmatrix}
=
\begin{bmatrix}
f/z_c & 0 & 0 \\
0 & f/z_c & 0 \\
0 & 0 & 1/z_c
\end{bmatrix}
\begin{bmatrix}
x_c \\ y_c \\ z_c
\end{bmatrix}
\tag{1.4}
通过公式(1.4),我们建立了相机坐标系与图像坐标系的联系。
1.1.4 世界坐标系
如图1.2所示,世界坐标系也是一个三维坐标系,在不同的应用场景中,世界坐标系的定义并不一样,比如大地测量中,将水准原点当做世界坐标系的原点;在相机标定中,将标定板的某个角点作为世界坐标系。
事实上,本小节讨论的所有坐标系都有多种建立方法,一般都是根据实际应用,取比较方便的建立方式。
图1.3 坐标系的旋转和平移
不过,无论世界坐标系如何建立,我们都能通过旋转和平移让它与相机坐标系一致。设 3D 世界点 p 在世界坐标系中的坐标为 (x_w, y_w, z_w),则可以通过一个 3\times3 的单位正交旋转矩阵 R 和 3\times1 的平移向量 t 将其转换为相机坐标系中的坐标 (x_c, y_c, z_c):
\begin{bmatrix}
x_c \\ y_c \\ z_c
\end{bmatrix}
= R
\begin{bmatrix}
x_w \\ y_w \\ z_w
\end{bmatrix}
+ t
=
\begin{bmatrix}
R & t
\end{bmatrix}
\begin{bmatrix}
x_w \\ y_w \\ z_w \\ 1
\end{bmatrix}
\tag{1.5}
1.2 相机矩阵
相机的内参矩阵,外参矩阵,投影矩阵是什么呢?
1.2.1 内参矩阵
公式(1.4)给出了相机坐标系与图像坐标系之间的联系,实际上,结合公式(1.2),可以得到相机坐标系与像素坐标系之间的关系:
\begin{bmatrix}
u \\ v \\ 1
\end{bmatrix}
=
\begin{bmatrix}
1/d_x & 0 & u_0 \\
0 & 1/d_y & v_0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
f/z_c & 0 & 0 \\
0 & f/z_c & 0 \\
0 & 0 & 1/z_c
\end{bmatrix}
\begin{bmatrix}
x_c \\ y_c \\ z_c
\end{bmatrix}
=
\frac{1}{z_c}
\begin{bmatrix}
f/d_x & 0 & u_0 \\
0 & f/d_y & v_0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x_c \\ y_c \\ z_c
\end{bmatrix}
\tag{1.6}
通常将 z_c 记为尺度因子 \lambda,等式最右侧中间的 3\times3 矩阵称作内参矩阵 K,显然,内参矩阵 K 描述的是 3D 世界点从相机坐标系到像素坐标系的变换,公式 (1.6) 此时可简写为:
\lambda p_{uv} = K p_c \tag{1.7}
内参矩阵 K 是描述相机固有性质的矩阵,f/d_x 和 f/d_y 表示以像素为单位的焦距,令 f_x = f/d_x, f_y = f/d_y,则 f_x 和 f_y 分别表示像素坐标系两个坐标轴方向的以像素为单位的焦距值,此时记:
K = \begin{bmatrix}
f_x & 0 & u_0 \\
0 & f_y & v_0 \\
0 & 0 & 1
\end{bmatrix} \tag{1.8}
另外需要说明的是,限于工艺的不完美性,通常像素不是理想状态下的矩形,而是一个平行四边形:
图1.4 不理想的像素
一般通过引入倾斜因子 s 描述这种不理想特性:
K = \begin{bmatrix}
f_x & s & u_0 \\
0 & f_y & v_0 \\
0 & 0 & 1
\end{bmatrix} \tag{1.9}
1.2.2 外参矩阵
回顾公式 (1.5),通常把 \begin{bmatrix} R & t \end{bmatrix} 称作外参矩阵。需要提一点的是,在不同学科中外参矩阵会有一些定义区别,比如在摄影测量学科中,将相机坐标系转换到世界坐标系的旋转矩阵 R 以及摄影中心在世界坐标系中的位置 C 作为外参。它们目的一致,都是为了描述相机和世界坐标系之间的转换关系。
1.2.3 投影矩阵
实际上,我们建立各个坐标系只是为了方便计算,在应用中,最直接接触的通常是 3D 世界中的坐标与图像中像素坐标的关系,这样的转换没有什么难度,结合公式 (1.7) 与 (1.5) ,可得:
\lambda p_{uv} = K \begin{bmatrix}
R & t
\end{bmatrix}
\begin{bmatrix}
p_w \\ 1
\end{bmatrix} \tag{1.10}
将 K \begin{bmatrix} R & t \end{bmatrix} 记为 M,则 M 可以将 3D 世界中的坐标投影到图像中,得到像素坐标。M 通常被称作投影矩阵,它是一个 3\times4 的矩阵,等于内参矩阵和外参矩阵的乘积。
1.3 相机畸变
相机矩阵没有考虑镜头畸变,因为理想的针孔相机没有镜头。回到现实世界的真实相机,限于工艺不能制作出完美的理想镜头,因此相机在成像过程中会引入畸变,一般将畸变分为径向和切向镜头畸变。
为了校正这些镜头畸变,相机标定过程中会估计畸变系数,并在图像处理过程中应用这些系数来校正畸变。校正后的图像将更接近真实场景,能够提高视觉感知和计算机视觉算法的准确性。
1.3.1 径向畸变
径向畸变是由光线在穿过镜头时发生弯曲引起的,导致图像中的直线出现弯曲。径向畸变主要分为两类:桶形畸变和枕形畸变。桶形畸变会导致图像中的直线向中心弯曲,而枕形畸变则会导致直线向外侧弯曲。
图1.5 桶形畸变,没有畸变,枕形畸变
在针孔相机模型中,一般采用以下方式对镜像畸变做校准:
x_{distorted} = x(1+k_1r^2 + k_2r^4 + k_3r^6) \\
y_{distorted} = y(1+k_1r^2 + k_2r^4 + k_3r^6)
\tag{1.11}
其中,(x_{distorted}, y_{distorted}) 表示实际观测到的畸变点, x, y 表示无畸变的像素位置,x 和 y 使用归一化图像坐标,归一化图像坐标通过将像素坐标平移到光学中心并除以像素焦距计算,因此,x 和 y 是无单位的。r^2 = x^2 + y^2。k_1, k_2, k_3 是畸变系数,一般通过相机标定得到。
通常,对于校准来说,两个系数就足够了。对于严重的畸变,例如在广角镜头中,可以选择三个系数来包括 k_3。
矫正
当已知畸变系数后,根据实际观测到的畸变点 (x_{distorted}, y_{distorted}) 计算出无畸变的点 (x, y) 的过程称作矫正过程。从公式 (1.11) 可得:
x = \frac{x_{distorted}}{1+k_1r^2 + k_2r^4 + k_3r^6} \\
\\
y = \frac{y_{distorted}}{1+k_1r^2 + k_2r^4 + k_3r^6}
但是,直接解这个方程会导致一个隐式方程,因为 r 取决于无畸变坐标。因此,我们使用迭代法来逼近解。在每次迭代中,我们假设当前的无畸变坐标估计(x_{distorted}, y_{distorted})足够接近真实值,可以使用这些估计值来计算r,并用它来更新无畸变坐标的估计:
x_{n+1} = \frac{x_{distorted}}{1+k_1 r_n^2 + k_2 r_n^4 + k_3 r_n^6} \\
\\
y_{n+1} = \frac{y_{distorted}}{1+k_1 r_n^2 + k_2 r_n^4 + k_3 r_n^6} \\
\\
r_n^2 = x_{n}^2 + y_{n}^2 \\
x_0, y_0 = x_{distorted}, y_{distorted}
1.3.2 切向畸变
切向畸变是由镜头制造过程中的误差引起的,导致图像中的直线出现倾斜。这种畸变通常是由于镜头安装不正确或镜头本身制造不精确导致的。
图1.6 切向畸变
在针孔相机模型中,一般采用以下方式对镜像畸变做校准:
x_{distorted} = x + [2p_1xy + p_2(r^2 + 2x^2)] \\
y_{distorted} = y + [p_1(r^2 + 2y^2) + 2p_2xy]
\tag{1.12}
p_1, p_2 是修正系数,一般通过相机标定得到。其他符号的意义与公式 (1.11) 中的一致。
1.4 小结
本小节介绍了针孔相机模型,并且最终给出了 3D 世界点与图像中像素点的关系,为了描述这种关系,我们构建了几种坐标系并给出相关关系,从这些关系中我们抽象出了几个关键的矩阵。最后介绍了针孔相机模型的两类畸变,并给出了畸变的校准方式。