Vanishing Points and Their Applications


消失点是三维视觉中的重要概念,很多与之相关的文献使用所谓“高斯球表达”这一让人难以理解的概念。这篇文章将总结消失点(与它们的“高斯球表达”)是什么,如何表示它们,它们编码了何种信息,以及为什么它们是有用的。

在透视几何中,将三维空间中的一组平行线投影于图像上时,这些平行线会相交于二维空间中的同一点,该点即为它们的消失点。我们可以写出 3D ray 的方程,一条 3D ray 上任意一点可以被表示为 \(\mathbf{o}+\lambda\mathbf{d}\),其中 \(\mathbf{o}\) 是端点,\(\mathbf{d}\) 是线的方向。如果我们令 \(\mathbf{K}\) 为相机校准矩阵,则一条 ray 在二维空间中的投影可被表示为:

\[z\begin{bmatrix} p_x \\ p_y \\ 1 \end{bmatrix} = \mathbf{K}\cdot (\mathbf{o} + \lambda\mathbf{d}).\]

消失点 \(\mathbf{p}\) 被定义为线在无穷远处的投影。为了找到 \(\mathbf{p}\) 的位置,我们令 \(\lambda\rightarrow \infty\),那么 \(\mathbf{o}\) 对投影点 \(\mathbf{p}\) 的贡献可以忽略不计。因此,消失点 \(\mathbf{p} \sim \mathbf{K}\cdot \mathbf{d}\) 可以由方向 \(\mathbf{d}\) 唯一确定。

上述推导同时也表明,如果我们可以检测图像中的消失点 \(\mathbf{p}\),我们就可以计算三维空间中对应的那些平行线的方向 \(\mathbf{d}\) 了。

现在我们有两条三维空间中互相平行的线 \(\ell_1\) 与 \(\ell_2\),当他们投影在位于 \(z=1\) 处的平面上时,对应的二维空间中的投影线的端点分别是 \((u_1, u_2)\) 与 \((v_1, v_2)\),并且我们假设相机是经过校准的。若相机位于 \(\mathbf{o}=(0,0,0)\),则三角形 \(\triangle ou_{1}u_{2}\) 与 \(\triangle ov_{1}v_{2}\) 的法向分别为:

\[\begin{align} \mathbf{n}_{u} &= \boldsymbol{u}_{1}\times \boldsymbol{u}_{2}\\ \mathbf{n}_{v} &= \boldsymbol{v}_{1}\times \boldsymbol{v}_{2}. \end{align}\]

任何位于平面 \(\triangle ou_{1}u_{2}\) 上的线一定与它的法向 \(\mathbf{n}_u\) 垂直,平面 \(\triangle ov_{1}v_{2}\) 同理。令 \(\mathbf{d}\) 是 \(\ell_1\) 与 \(\ell_2\) 的方向向量,则这种正交关系可以表示为 \(\mathbf{n}_{u} \perp \mathbf{d} \perp \mathbf{n}_{v}\),则有:

\[\mathbf{d}=\mathbf{n}_{u}\times \mathbf{n}_{v}.\]

并且,\(\mathbf{d}\) 与平面 \(z=1\) 的交点亦为二维空间中两条线 \((u_1, u_2)\) 与 \((v_1, v_2)\) 的交点 \(\mathbf{p}\),也就是所谓的消失点。方向向量 \(\mathbf{d}\) 被称之为消失点 \(\mathbf{p}\) 的高斯球表达。

可以发现,比起使用二维空间中的交点,方向向量 \(\mathbf{d}\) 是更好的表达。首先, \(\mathbf{d}\) 可能不与焦平面相交(当它是垂直的时候,消失点在几乎无穷远处)。此外,很难定义一种度量来表示两个消失点之间的距离。如果相机校准矩阵是已知的,常用的欧式距离并不是一个好的选择。然而,如果我们使用方向向量 \(\mathbf{d}\) 作为表达,就可以用它们之间的角度来表示距离度量:

\[D\left(\mathbf{d}_{1},\mathbf{d}_{2}\right)=\left\langle \frac{\mathbf{d}_{1}}{\left\Vert \mathbf{d}_{1}\right\Vert },\frac{\mathbf{d}_{2}}{\left\Vert \mathbf{d}_{2}\right\Vert }\right\rangle\]

消失点的一个应用是检测相片是否被 Photoshop 篡改(tampered)过,我们以相片裁剪(cropped)为例。这等价于从图像恢复相机校准矩阵

\[\mathbf{K}=\begin{bmatrix} f & 0 & o_{x}\\ & f & o_{y}\\ & & 1 \end{bmatrix}.\]

之所以 \(\mathbf{K}\) 可以告诉我们相片是否被裁剪过,是因为对于通常的相机与镜头,焦距 \(f\) 的选择往往是受限的。并且相机中心的偏移 \((o_x, o_y)\) 应该位于图像中心附近。如果图像被随意地剪裁过,那么这些性质将不会被满足。

一种恢复 \(\mathbf{K}\) 的方式是利用消失点。为了成功的恢复相机校准矩阵,我们需要至少三个正交的消失点。找到这些消失点不是很难,可以通过标记彼此垂直的三对平行线来完成,每一对平行线唯一确定一个消失点。在人造场景中,这样的三对平行线很容易被找到,因为这种场景中的物体一般是方的。

一旦我们找到了三个相互正交的消失点,我们就可以利用它们来恢复 \(\mathbf{K}\)。我们记图像空间中的对应两条线分别为 \((\hat{u}_1, \hat{u}_2)\) 与 \((\hat{v}_1, \hat{v}_2)\),对应的坐标是像素坐标系下的位置。根据相机的透视投影模型,我们有

\[\begin{align*} z_{u_i}\hat{u}_{i} & =\mathbf{K}u_{i}\\ z_{v_i}\hat{v}_{i} & =\mathbf{K}v_{i}, \end{align*}\]

其中 \(u_i\) 与 \(v_i\) 是校准图像空间中的位置,\(i\) 的取值为 \(i\in \{1,2\}\)。那么,方向向量可以表示为:

\[\begin{align*} \mathbf{d} & =\mathbf{n}_{u}\times \mathbf{n}_{v}\\ & =\left(u_{1}\times u_{2}\right)\times\left(v_{1}\times v_{2}\right)\\ & \propto \left[\left(\mathbf{K}^{-1}\hat{u}_{1}\right)\times\left(\mathbf{K}^{-1}\hat{u}_{2}\right)\right]\times\left[\left(\mathbf{K}^{-1}\hat{v}_{1}\right)\times\left(\mathbf{K}^{-1}\hat{v}_{2}\right)\right]\\ & \stackrel{1}{=}\left[\mathbf{K}^{T}\left(\hat{u}_{1}\times\hat{u}_{2}\right)\right]\times\left[\mathbf{K}^{T}\left(\hat{v}_{1}\times\hat{v}_{2}\right)\right]\\ & \stackrel{2}{=}\mathbf{K}^{-1}\left[\left(\hat{u}_{1}\times\hat{u}_{2}\right)\times\left(\hat{v}_{1}\times\hat{v}_{2}\right)\right]\\ & =: \mathbf{K}^{-1}\left(\hat{\bf n}_{u}\times\hat{\bf n}_{v}\right)\\ & =: \mathbf{K}^{-1}\hat{\bf d}. \end{align*}\]

那么,如果我们有三个两两正交的消失点 \(\mathbf{d}_{1}\perp \mathbf{d}_{2}\perp \mathbf{d}_{3}\),根据两两正交关系有:

\[\begin{align*} \hat{\bf d}^T_{1}\mathbf{K}^{-T}\mathbf{K}^{-1}\hat{\bf d}_{2} & =0\\ \hat{\bf d}^T_{2}\mathbf{K}^{-T}\mathbf{K}^{-1}\hat{\bf d}_{3} & =0\\ \hat{\bf d}^T_{3}\mathbf{K}^{-T}\mathbf{K}^{-1}\hat{\bf d}_{1} & =0. \end{align*}\]

注意到上式中

\[\mathbf{S} := \mathbf{K}^{-T}\mathbf{K}^{-1}=\frac{1}{f^{2}}\begin{bmatrix}1 & 0 & -o_{x}\\ 0 & 1 & -o_{y}\\ -o_{x} & -o_{y} & o_{x}^{2}+o_{y}^{2}+f^{2} \end{bmatrix}\]

因而三个方程关于 \(o_x\),\(o_y\) 与 \(o_x^2 + o_y^2 + f^2\) 是线性的。如果我们有超过三个消失点,我们可以做 lasso 优化

\[\min_{f,o_{x},o_{y}}\sum_{i,j}\ \left|\hat{\bf d}^{T}_{i}\mathbf{S}\hat{\bf d}_{j}\right|\]

进而找到最佳的相机参数。

(原文地址: Yichao Zhou’s Blog)