跳转至

相机模型

从世界到相机

假设相机坐标系的三个正交单位向量分别是 x^c\hat{x}_cy^c\hat{y}_cz^c\hat{z}_c,那么可以得知世界坐标系变为相机坐标系的变换矩阵为 [x^c,y^c,z^c][\hat{x}_c, \hat{y}_c, \hat{z}_c],其逆矩阵就是相机的旋转矩阵 RR,也就是相机的方向

R=[x^cy^cz^c]=[r11r12r13r21r22r23r31r32r33] R = \begin{bmatrix} \hat{x}_c \\ \hat{y}_c \\ \hat{z}_c \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \\ \end{bmatrix}

xw\mathbf{x}_w 表示一个点在世界坐标系中的坐标,xc\mathbf{x}_c 表示该点在相机坐标系中的坐标,cw\mathbf{c}_w 表示相机在世界坐标系中的坐标,那么有

xc=R(xwcw)=RxwRcw=Rxw+t \begin{aligned} \mathbf{x}_c &= R(\mathbf{x}_w - \mathbf{c}_w) \\ &= R\mathbf{x}_w - R\mathbf{c}_w \\ &= R\mathbf{x}_w + \mathbf{t} \end{aligned}

其中 t\mathbf{t} 是世界坐标系的原点在相机坐标系中的位置

t=Rcw=[txtytz] \mathbf{t} = -R\mathbf{c}_w = \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix}

整个方程可以通过一个外参矩阵(extrinsic matrix)表示

x~c=[xcyczc1]=[r11r12r13txr21r22r23tyr31r32r33tz0001][xwywzw1]=Mextrx~w \mathbf{\tilde{x}}_c = \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} = M_{extr}\mathbf{\tilde{x}}_w

从相机到像素

我们可以通过透视投影将三维坐标转换为二维坐标

xi=f[xc/zcyc/zc1] \mathbf{x}_i = f \cdot \begin{bmatrix} x_c/z_c \\ y_c/z_c \\ 1 \end{bmatrix}

mx,mym_x, m_y 分别为 x 和 y 方向上的像素密度(像素/毫米),(cx,cy)(c_x, c_y) 为主点(Principal Point),即光轴与传感器的交点,那么最终的二维坐标为

u=[uv]=[mxfxczc+cxmyfyczc+cy] \mathbf{u} = \begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} m_xf\frac{x_c}{z_c} + c_x \\ m_yf\frac{y_c}{z_c} + c_y \end{bmatrix}

fx=mxff_x = m_xffy=myff_y = m_yf,则该方程可以通过一个内参矩阵(intrinsic matrix)以齐次坐标的形式表示

u~=[u~v~1][fx0cx00fycy00010][xcyczc1]=Mintrx~c \mathbf{\tilde{u}} = \begin{bmatrix} \tilde{u} \\ \tilde{v} \\ 1 \end{bmatrix} \equiv \begin{bmatrix} f_x & 0 & c_x & 0 \\ 0 & f_y & c_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} = M_{intr}\mathbf{\tilde{x}}_c

最终,我们可以得到一个投影矩阵(projection matrix)

u~MintrMextrx~w=P3×4x~w \mathbf{\tilde{u}} \equiv M_{intr}M_{extr}\mathbf{\tilde{x}}_w = P_{3\times 4}\mathbf{\tilde{x}}_w

从像素到光线

若我们不知道相机的内参矩阵,可以尝试从图像的大小和视角计算出来。假设图像的宽度为 WW,相机的水平视角(FOV,Field of View)为 θx\theta_x,图像某一角的像素点在相机坐标系中的坐标为 (x0,y0,z0)(x_0, y_0, z_0),那么我们有

fxx0z0=12W f_x \frac{x_0}{z_0} = \frac{1}{2}W
tanθx2=x0z0=W2fx \Rightarrow \tan \frac{\theta_x}{2} = \frac{x_0}{z_0} = \frac{W}{2f_x}
fx=W2tan(θx/2) \Rightarrow f_x = \frac{W}{2\tan(\theta_x/2)}

类似地,我们可以得到 fyf_y,然后就可以构建出内参矩阵。

假设我们已经知道某一相机在世界坐标系的位置为 o\mathbf{o},该相机中某一像素的坐标为 (u,v)(u, v),那么我们可以通过内参矩阵得到该像素点在相机坐标系中的坐标

x^c=[xcyc1]=[1/fx0cx/fx01/fycy/fy001][uv1]=MF1u~ \hat{\mathbf{x}}_c = \begin{bmatrix} x_c \\ y_c \\ 1 \end{bmatrix} = \begin{bmatrix} 1/f_x & 0 & - c_x/f_x \\ 0 & 1/f_y & - c_y/f_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = M_F^{-1}\mathbf{\tilde{u}}
x~c=[xcyc11]\mathbf{\tilde{x}}_c = \begin{bmatrix} x_c \\ y_c \\ 1 \\ 1 \end{bmatrix}

再通过外参矩阵得到该像素点在世界坐标系中的坐标,并由此计算出从相机中心出发的光线方向

x~w=Mextr1x~c=[xwywzw1] \quad \mathbf{\tilde{x}}_w = M_{extr}^{-1} \mathbf{\tilde{x}}_c = \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
d=xwoxwo \mathbf{d} = \frac{\mathbf{x}_w - \mathbf{o}}{\left\| \mathbf{x}_w - \mathbf{o} \right\|}

最后,即可得到光线的参数方程

x=o+td \mathbf{x} = \mathbf{o} + t\mathbf{d}