单目相机成像原理
几个概念
- 光轴:垂直穿过理想透镜中心的光线
- 焦点:与光轴平行的光线射入凸透镜时,所有光线会聚在透镜后方一点,该点称为焦点
- 焦距:镜片中心到焦点在光轴上的距离。入射平行光线(或其延长线)与出射会聚光线(或其延长线,下图中红色虚线)相交,可确定折射主面;该想象平面与光轴的交点即主点
- 光圈:影响进光量与景深
Figure 1 单目相机
Figure 2 光圈
坐标转换
- 像素坐标系:以图像左上角为原点,即 u-v 坐标系,单位为 pixel,记为 O_p-(u,v)。方向为右 u、下 v
- 图像坐标系:以图像中心为原点,即 x-y 坐标系,单位为 mm 等物理量,记为 O_i-(x,y)。方向为右 x、下 y
- 相机坐标系:以相机光心为原点,X 轴、Y 轴分别平行于图像坐标系的 X、Y 轴,光轴为 Z 轴,记为 O_c-(X_c, Y_c, Z_c)
- 世界坐标系:三维世界的绝对坐标系,记为 O_w-(X_w, Y_w, Z_w)。常用「东-北-天」约定:以北为车头朝向时,东为 X_w,北为 Y_w,上为 Z_w。世界坐标系是全局共享的 3D 坐标系,为 ADAS 中 ego、相机、3D 点、障碍物等提供统一的位置标尺
图像成像按 世界坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系 的顺序转换,通常以相机光心为原点构建坐标系:
Figure 3 相机坐标系(图为 png 格式,请勿在黑暗模式下查看此图)
世界坐标系 → 相机坐标系
属于刚体变换,包含旋转 R 与平移 t:
\begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix}
=
\begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}
\begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}
相机坐标系 → 图像坐标系
Figure 4 相似三角形
相机坐标系到图像坐标系的距离为焦距 f,由相似三角形:
\frac{x}{X_c} = \frac{f}{Z_c}, \quad \frac{y}{Y_c} = \frac{f}{Z_c}
因此:
\begin{cases} x = f \dfrac{X_c}{Z_c} \\[6pt] y = f \dfrac{Y_c}{Z_c} \end{cases}
整理为齐次坐标形式:
Z_c \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}
=
\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}
\begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix}
图像坐标系 → 像素坐标系
两者处在同一平面,但有两点不同:
- 坐标原点不同:图像坐标系原点在成像平面中心;像素坐标系原点在左上角
- 单位不同:图像坐标系为 mm;像素坐标系为 pixel。横向 1\ \text{pixel} = dx\ \text{mm},纵向 1\ \text{pixel} = dy\ \text{mm}
图像坐标到像素坐标仅需一次缩放 + 平移:
\begin{cases} (u - u_0)\, dx = x \\[6pt] (v - v_0)\, dy = y \end{cases}
其中 (u,v) 和 (x,y) 分别为像素坐标系和图像坐标系中的坐标,(u_0, v_0) 为像素原点到图像中心的偏移,属于内参的一部分。
即:
\begin{cases} u = \dfrac{x}{dx} + u_0 \\[6pt] v = \dfrac{y}{dy} + v_0 \end{cases}
齐次坐标形式:
\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}
=
\begin{bmatrix} \dfrac{1}{dx} & 0 & u_0 \\ 0 & \dfrac{1}{dy} & v_0 \\ 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}
整合变换
联立上述变换:
Z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}
=
\begin{bmatrix} \dfrac{1}{dx} & 0 & u_0 \\ 0 & \dfrac{1}{dy} & v_0 \\ 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}
\begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}
\begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}
合并后:
Z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}
=
\begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}
\begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}
其中 f_x = \dfrac{f}{dx},f_y = \dfrac{f}{dy},将焦距从 mm 换算为 pixel 单位。
以 120° FOV 的森云相机为例:像素尺寸 3 \times 10^{-3}\ \text{mm},焦距 3\ \text{mm},可推断 f_x、f_y 接近 1000。
u_0、v_0 表示相机光心在像素坐标系中的偏移量,单位为 pixel。
K = \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix}
为相机内参矩阵 (Camera Intrinsic Matrix),描述三维点投影到像素平面的变换。
T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}
为相机外参矩阵 (Camera Extrinsic Matrix),描述世界坐标系到相机坐标系的刚体变换。
畸变矫正
针孔模型是理想成像模型,物像满足相似三角形关系。但由于透镜加工误差,实际成像存在几何失真,称为畸变。失真程度从画面中心向边缘递增,边缘最为明显。
畸变分为径向畸变和切向畸变两类。
径向畸变
通常由透镜形状引起,越靠近边缘越严重,分为桶形畸变和枕形畸变:
Figure 5 径向畸变
可用 r=0 处泰勒展开的前几项近似,k_1, k_2, k_3 为径向畸变系数:
x_{\text{distorted}} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6)
y_{\text{distorted}} = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6)
切向畸变
通常由透镜与成像平面不严格平行引起,需额外参数 p_1, p_2。OpenCV 完整畸变模型为:
x_{\text{distorted}} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2 p_1 xy + p_2(r^2 + 2x^2)
y_{\text{distorted}} = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2 p_2 xy + p_1(r^2 + 2y^2)
参考文献
[1] 针孔相机模型
[2] 单目相机标定原理
[3] 相机模型:单目、双目、深度相机模型及相机畸变
评论