深度到底是什么

相信有很多人也一直搞不清深度的概念,最近仔细推导了一遍,记录一下。

几何关系

上图中 \(O\) 为投影中心,\(O-XYZ\) 为相机坐标系,\(o-xy\) 为像素坐标系,\(P\) 为一物点,\(p\) 为该物点对应的像点。

基本公式

我们先不考虑 \(f_x\)\(f_y\) ,由上图中很明显的两个相似三角形可以得到: \[ \begin{equation} \frac{x_i-x_0}{X_c} =\frac{y_i-y_0}{Y_c}= \frac{f}{Z_c} \end{equation} \] 乘开后得到: \[ \begin{equation} Z_c\cdot x_i=f\cdot X_c + Z_c\cdot x_0 \end{equation} \]

\[ \begin{equation} Z_c\cdot y_i={f\cdot Y_c}+Z_c\cdot y_0 \end{equation} \]

写成矩阵形式: \[ \begin{equation} \begin{bmatrix}Z_c\cdot x_i\\Z_c\cdot x_i\\Z_c\end{bmatrix}= \begin{bmatrix}f&0&x_0\\0&f&y_0\\0&0&1\end{bmatrix}\cdot \begin{bmatrix}X_c\\Y_c\\Z_c \end{bmatrix} \end{equation} \] 欸嘿,我们推出了 \(K\) 矩阵,将等式左边改写: \[ \begin{equation} \begin{bmatrix}u\\v\\w \end{bmatrix}= \begin{bmatrix}f&0&x_0\\0&f&y_0\\0&0&1\end{bmatrix}\cdot \begin{bmatrix}X_c\\Y_c\\Z_c \end{bmatrix} \end{equation} \] 那么: \[ x_i=u/w \]

\[ y_i=v/w \]

\[ w=Z_c \]

现在,考虑 \(f_x\)\(f_y\) ,就可以得到: \[ \begin{equation} \begin{bmatrix}u\\v\\w \end{bmatrix}= \begin{bmatrix}f_x&0&x_0\\0&f_y&y_0\\0&0&1\end{bmatrix}\cdot \begin{bmatrix}X_c\\Y_c\\Z_c \end{bmatrix} \end{equation} \] 经过上面的推导,我们发现了什么,\(w=Z_c\)?没错,\(w\) 就是传说中的深度

深度

深度:物点到投影中心的垂距,即 \(Z_c\)

这时候有人可能会问了, \(Z_c\) 不是相机坐标系下的物点坐标吗,深度不是应该用世界坐标系下的坐标计算吗?

事实上,我们要明确一件事,在我们思考整个成像过程的时候,一个便于理解的思维模式是:想象物点的位置是保持不变的,所有的R和t都是针对坐标系的变化。有了这个思维模式,我们就清楚了,世界坐标系和相机坐标系之间只有R和t的变换,并没有涉及到尺度的变化,所以,世界坐标系和相机坐标系的尺度是一致的,量纲是一致的,\(Z_c\) 就是深度,\(t\)\(C\) 都是由几何意义的(相对定向中的tij到底是什么)。

思考

  • 已知物点坐标和P矩阵,可以得到像点坐标和深度

  • 已知像点坐标和P矩阵,则无法直接求出物点坐标,只能得到物点和投影中心连线的这根光线,有了深度,才能确定物点坐标

  • 最后再把公式整理一下吧:

\[ \begin{equation} \begin{bmatrix}x_i\\y_i\\1 \end{bmatrix}=\frac{1}{w}\cdot \begin{bmatrix}f_x&0&x_0\\0&f_y&y_0\\0&0&1\end{bmatrix}\cdot \begin{bmatrix}X_c\\Y_c\\Z_c \end{bmatrix} \end{equation} \]

\[ \begin{equation} \begin{bmatrix}X_c\\Y_c\\Z_c \end{bmatrix}= w\cdot \begin{bmatrix} \frac{1}{f_x}&0&\text{-}\frac{x_0}{f_x}\\ 0&\frac{1}{f_y}&\text{-}\frac{y_0}{f_y}\\ 0&0&1 \end{bmatrix}\cdot \begin{bmatrix}x_i\\y_i\\1 \end{bmatrix} \end{equation} \]