单目视觉¶
约 2462 个字 13 张图片 预计阅读时间 10 分钟
相机基本原理¶
薄透镜¶

薄透镜的焦距、物距和像距之间的关系可以用透镜方程来表示: $$ \frac{1}{f} = \frac{1}{d_o} + \frac{1}{d_i} $$
景深¶
景深(Depth of Field)是指在拍摄时,能够保持清晰的范围。景深的大小与光圈、焦距和物距有关。
当我们在摄影时,通常不可能保证所有的物体都在焦点上,但在焦点(焦距)附近的物体都可以保证一定的清晰度。景深指的就是能保证物体清晰的物距范围。

- 从上图中我们可以看到,光圈越大,景深越小;光圈越小,景深越大
- 但是较小的光圈可能会导致接收到的光线减少,从而需要更多的曝光时间
视野¶

Field of View(FOV)
- 放大倍数越大(焦距越大),视野越小
- 当 FOV 偏大或偏小时,图像中的物体会产生畸变
投影¶

我们可以很容易地得到一个式子: $$ \dfrac{-x}{f} = \dfrac{X}{Z} \longrightarrow -x = f \dfrac{X}{Z} $$ 这里的负号表示小孔成像的方向与物体方向相反

但有时候成像的小孔未必处在中心位置,这时候我们可以给上面的式子添加一个偏移量
于是现在我们就可以得到相机内部的参数
其中 \(f_x = F s_x,\ f_y = F s_y\)
- \(F\) 是物体实际的大小,单位是 mm 等,
- \(s_x,\ s_y\) 是把实际物体转换到屏幕像素的转换因子,单位是 pixel/mm 等
- \(f_x,\ f_y\) 的单位是 pixel
intrinsic parameters
我们把 \((f_x, f_y, c_x, c_y)\) 称为相机的内部参数/固有参数(intrinsic parameters)
但我们注意到上面的式子需要除以 \(Z\),并不是一个便于计算的线性关系。这里有一个小技巧:我们可以添加一个额外的坐标维度,从而把笛卡尔坐标转化为齐次坐标

类似地,我们也可以把齐次坐标转换为原先的笛卡尔坐标

于是我们就可以把上面的式子写成矩阵乘法的形式: $$ q = MQ $$ 其中 $$ q = \begin{bmatrix} x \ y \ z \end{bmatrix}\quad M = \begin{bmatrix} f_x & 0 & c_x \ 0 & f_y & c_y \ 0 & 0 & 1 \end{bmatrix} \quad Q = \begin{bmatrix} X \ Y \ Z \end{bmatrix} $$
透镜畸变¶
我们使用的透镜不可能是完美的,由于透镜的种种瑕疵,所成的像会出现各种畸变。
径向畸变¶

图像径向畸变是图像像素点以畸变中心为中心点,沿着径向产生的位置偏差,从而导致图像中所成的像发生形变。图像径向畸变是成像过程中最主要的畸变,同时也是对成像效果影响最大的畸变。
- 枕形畸变(pin cushion):从图像的中心点到图像的边缘点图像的相对大小逐渐变大
- 桶形畸变(barrel):从图像的中心点到图像的边缘点图像的相对大小逐渐变小
Correcting Radial Distortion
对径向畸变进行建模和矫正的方法是对 \(x\) 和 \(y\) 进行修正
切向畸变¶
切向畸变由于镜头的设计和制造过程中,镜头的各个光学元件(如透镜)之间相对位置的不完美,尤其是透镜元件的对准误差。
例如当透镜和感光的 CMOS 芯片之间没有对准时就会导致切向畸变

要对切向畸变进行建模和校正,可以按照如下的方式:
distortion parameters
我们把 \((k_1, k_2, p_1, p_2, k_3)\) 称为相机的畸变参数(distortion parameters)
坐标系¶
四大坐标系
- 世界坐标系:也称测量坐标系,它是一个三维直角坐标系 \((x_w, y_w, z_w)\)
- 在世界坐标系中,可以描述相机和待测物体的空间位置。而世界坐标系的位置根据实际情况自行确定。
- 相机坐标系:同样是一个三维直角坐标系 \((x_c, y_c, z_c)\)
- 相机坐标系的原点是镜头的光心,x、y 轴分别与像平面两边平行,z 轴为镜头的光轴,与像平面垂直
- 图像坐标系:也叫平面坐标系,用物理单位(例如 mm)表示像素的位置
- 从相机坐标系转换到图像坐标系属于从 3D 转换到 2D的透视投影关系
- 像素坐标系:使用像素来表示图像
上面我们讨论的是相机内部的参数,但实际上都属于相机坐标系到图像坐标系的转换。也就是说,之前我们得到的矩阵乘法实际上是 $$ q_{image} = MQ_{cam} $$ 其中 $$ q_{image} = \begin{bmatrix} x \ y \ z \end{bmatrix} , \quad M = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} , \quad Q_{cam} = \begin{bmatrix} X_{cam} \\ Y_{cam} \\ Z_{cam} \end{bmatrix} $$
世界坐标系到相机坐标系¶
世界坐标系到相机坐标系的变换属于刚体变换,即只需要改变物体的空间位置(平移)和朝向(旋转),而不改变物体的形状。
我们可以使用旋转矩阵 \(R\) 和平移向量 \(t\) 来表示这种变换 $$ \begin{bmatrix} x_w \\ y_w \\ z_w \end{bmatrix} = R \begin{bmatrix} x_c \\ y_c \\ z_c \end{bmatrix} + t $$ 其中 \(R\) 是一个 3×3 矩阵,\(t = [t_x, t_y, t_z]^T\) 是一个 3×1 矩阵
二维平面 xoy 的旋转可以看作三维坐标系围绕着 z 轴旋转 \(\theta\) 角的结果,即
另外两个方向的旋转也可以用类似的方式表示出来,因此旋转矩阵 \(R\) 就可以表示为三个角度的矩阵相乘 $$ R = R_z(\theta) R_y(\varphi) R_x(\psi) $$ 其中
我们现在继续使用齐次坐标来表示坐标系的转换,就可以写成
相机在世界坐标系中未必处于坐标轴中心,因此我们如果想要从 \(Q_w\) 转换到 \(Q_{cam}\),还需要进行一些处理。
我们用 \(O_w\) 表示世界坐标系原点所在位置,用 \(C_w\) 表示相机的位置,用 \(T = O_w - C_w\) 表示的就是相机在世界坐标系的位置。 $$ \begin{aligned} Q_{cam} &= R(Q_w - C_w) \\ &= R(Q_w - O_w + T) \\ &= RQ_{obj} + RT \end{aligned} $$ 即 $$ Q_{cam} = \begin{bmatrix} R & RT \\ 0 & 1 \end{bmatrix} Q_{obj} \Longrightarrow t = RT $$ 又因为 \(R\) 是一个正交矩阵,\(R^T = R^{-1}\),于是 $$ Q_{obj} = R^T Q_{cam} - T $$ 即 $$ Q_{obj} = \begin{bmatrix} R^T & -T \\ 0 & 1 \end{bmatrix} Q_{cam} \Longrightarrow t = -T $$
相机参数¶
Transformation between camera and object
- 外部参数(extrinsic parameters) $$ (\theta, \varphi, \psi, t_x, t_y, t_z) $$
- 内部参数(intrinsic parameters) $$ (f_x, f_y, c_x, c_y) $$
- 畸变参数(distortion parameters) $$ (k_1, k_2, p_1, p_2, k_3) $$
内部参数和外部参数属于 3D 几何,共有 10 个;畸变参数属于 2D 几何,共有 5 个。
从物体的世界坐标转换到图像坐标,可以概括为使用一个 3×4 的矩阵 \(\Pi\) 把外部坐标转变为内部坐标,其中 \(\Pi\) 是上面的几个矩阵相乘的结果。

相机标定¶
相机标定(Camera Calibration)是指通过一定的数学方法,估算出相机的内外参数,并通过这些参数来进行图像的几何校正。标定的目的是为了准确地理解相机成像过程中的各种畸变(如径向畸变、切向畸变)和图像坐标与实际世界坐标之间的映射关系。
棋盘格标定法
棋盘格标定法(Checkerboard Calibration): 这是最常见的标定方法。使用一个平面上的棋盘格图案,在多个视角下拍摄棋盘格图像。通过检测图像中棋盘格的角点(例如交点位置),结合棋盘格的实际物理尺寸,可以求解相机的内参和外参。
- 使用标定板(如棋盘格)拍摄一系列的图片,确保角度、距离等条件多样化。
- 对每张图片中的棋盘格角点进行检测(通常是交点位置)。
- 将每张图片的2D角点与已知的3D世界坐标进行对应,通过优化方法(如最小二乘法)计算出相机的内外参数。
每个角点的标定都可以生成 2 个约束条件(2 个约束方程)。回顾之前的内容,相机需要 6 个外部参数和 4 个内部参数,而每个视角对应的外部参数都是不同的。
假设共有 \(N\) 个角点,\(K\) 个不同的视角(图像),那么一共能得到 \(2NK\) 个角点约束条件。而我们需要的参数共有 \(K \times 6 + 4\) 个,因此需要保证 $$ 2NK \geqslant 6K + 4 $$ 即 $$ (N-3)K \geqslant 2 $$ 其中 \(K>1\)
注意到 \(K=2\) 时,\(N=4\),因此每 4 个角点就需要 2 个视角来处理。