对于实际空间中的某一点,从世界坐标到像素坐标,有如下的坐标变换关系。

\[\begin{equation} Z_{C}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{cccc} f_{x} & 0 & u_{0} & 0 \\ 0 & f_{y} & v_{0} & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left[\begin{array}{cc} R & T \\ \overrightarrow{0} & 1 \end{array}\right]\left[\begin{array}{c} X_{W} \\ Y_{W} \\ Z_{W} \\ 1 \end{array}\right]=M_{2} M_{1}\left[\begin{array}{c} X_{W} \\ Y_{W} \\ Z_{W} \\ 1 \end{array}\right]. \end{equation}\]

其中(XW,YW,ZW)为目标的世界坐标,在自动驾驶场景中一般以车前身作为世界坐标系的原点,(u0,v0)为像素坐标系的原点,即目标在图像中对应像素点的位置。其中M2、M1分别为相机的内参和外参,这些可以通过标定获得。通过目标检测,可以获取输出目标检测框的四个角点坐标(ut,vl)、(ut,vr)、(ub,vl)、(ub,vr)。由上面的式子可得

\[\begin{align} uZ_C &= f_xX_C+Z_C \\ vZ_C &= f_yX_C+Z_C \end{align}\]

推导可得

\[\begin{align} X_{Ct}-X_{Cb}=Z_C\frac{u_t-u_b}{f_x}\\ Y_{Ct}-Y_{Cb}=Z_C\frac{v_t-u_b}{f_y} \end{align}\]

对相机坐标和世界坐标有

\[\begin{align} \begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \end{bmatrix} =M_{1}^{T} \begin{bmatrix} X_C \\ Y_C \\ Z_C \\ 1 \end{bmatrix} \end{align}\]

\[\begin{align} M_{1}^{T}=\begin{bmatrix} m_{00} & m_{01} &m_{02} &m_{03} \\ m_{10} & m_{11} &m_{12} &m_{13} \\ m_{20} & m_{21} &m_{22} &m_{23} \\ m_{30} & m_{31} &m_{32} &m_{33} \end{bmatrix} \end{align}\]

则有

\[\begin{align} Z_W=m_{20}X_C+m_{21}Y_C+m_{22}Z_C+m_{23} \end{align}\]

假如我们已经知道目标的高度为H,则有

\[\begin{align} H=Z_H-Z_L=m_{20}(X_{Ct}-X_{Cb})+m_{21}(Y_{Ct}-Y_{Cb}) \end{align}\]

简化得到,

\[\begin{align} \frac{H}{Z_C}=m_{20}\frac{u_t-u_b}{f_x}+m_{21}\frac{u_t-v_b}{f_y} \end{align}\]

式中,其他的信息均为已知信息或可通过标定得到,因而可求出ZC的值,即目标到相机的距离。