图片消失点,地平线标定相机
用消失点和地平线标定相机是我的一项工作中的内容,其中涉及的一些多视图几何原理,在此做一个整理和回顾。
用道路消失点标定相机与道路的roll和pitch
从直观定义上来说,消失点是空间中的平行线投影到图像平面后产生的交点,可以认为三维空间中的平行线在无穷远处相交。那么从数学上,空间中一个方向与图像中消失点坐标的关系是怎样的呢?
空间点投影到2D平面的方程如下:
\[\lambda \left[ \begin{matrix} u \\ v \\ 1 \end{matrix}\right] = K [R | t] \left[ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix}\right]\]
空间中一条直线可以由一个方向向量为\(\vec{v}\),一个点为\(P_0\)来定义。这条直线上的点可以表示为:
\[P = P_0 + k \vec{v} \]
取不同的\(P_0\)可以得到一组平行的直线
把P代入投影方程,得到:
\[\lambda \left[ \begin{matrix} u \\ v \\ 1 \end{matrix}\right] = K [R | t] \left[ \begin{matrix} P_0 + k\vec{v} \\ 1 \end{matrix}\right]\]
消失点可以理解为空间直线无穷远处的点,即\(k\to \infty\),此时\(P_0\)和下面的1都约等于0. 那么公式转为:
\[ \lambda \left[ \begin{matrix} u \\ v \\ 1 \end{matrix}\right] = K [R | t] \left[ \begin{matrix} \vec{v} \\ 0 \end{matrix}\right] = KR \vec{v}\]
现在来看如何进行标定。假设我们的世界坐标系建立在道路方向上,绕z,x,y的角分别为roll,pitch,yaw

那么道路的方向\(\vec{v}\)即为\((0,0,1)\)
得到
\[\lambda p = K R \left[ \begin{matrix} 0 \\ 0 \\ 1 \end{matrix}\right] = KR_3 = K \left[ \begin{matrix} -cos(pitch)sin(yaw) \\ sin(pitch) \\ cos(pitch)cos(yaw) \end{matrix}\right] \]
可以看到只留下了pitch,yaw角。说明消失点对于roll角是不可观的。
我们可以利用旋转矩阵正交性(列向量模为1)消去\(\lambda\)
\[\frac{K^{-1}p}{\|K^{-1}p\|} = \left[ \begin{matrix} -cos(pitch)sin(yaw) \\ sin(pitch) \\ cos(pitch)cos(yaw) \end{matrix}\right] \]
左边已知,可求出pitch和yaw
用地平线估计roll角
这里所指的地平线可以认为是地平面和与其平行的平面在无穷远处的交线。
一个简单的推导如下:假设相机坐标系下的三维消失线为\(l_\infty\),消失点为\(P_\infty\) (都是齐次坐标系表示),那么有
\[P_\infty^T l_\infty = 0\]
\[P_\infty^T K^T K^{-T} l_\infty = 0\]
\[(KP_\infty)^T K^{-T} l_\infty = 0\]
而\(p_\infty = KP_\infty\)
\[(p_\infty)^T (K^{-T} l_\infty) = 0\]
则\(l_{horizon} = K^{-T} l_\infty\)
因此有以下等式,其中g为重力向量,R为世界坐标系到相机坐标系的旋转,K为内参,h是地平线在图像上投影的直线的齐次坐标。
\[h\propto K^{-T}Rg\]
在上图的道路坐标系下,重力向量可以表示为\([0,1,0]\),
\[\left[\begin{matrix} h_1 \\ h_2 \\ h_3 \end{matrix}\right]=h\propto K^{-T}R_2\]
图像平面上地平线的倾斜角\(\theta = arctan(-\frac{h_1}{h_2})\)
用多个消失点估计相机内外参
用三个正交方向的消失点标定相机内外参
求解内参:
在符合Manhattan假设的环境中(通常是人造建筑物),画面中存在三个正交的方向,如下图所示:

此时我们可以用图像上的三个消失点求解完整的相机内外侧。
我们把世界坐标系建在这个方向,那么这三个方向在世界坐标系下的方向可以定义为
\[e_1=\left[\begin{matrix} 1 \\ 0 \\ 0 \end{matrix}\right], e_2=\left[\begin{matrix} 0 \\ 1 \\ 0 \end{matrix}\right], e_3=\left[\begin{matrix} 0 \\ 0 \\ 1 \end{matrix}\right],\]
可以得到:
\[\lambda_i p_i = K R e_i\]
\[ e_i = \lambda R^T K^{-1} p_i\]
由 \(e_i^Te_j = 0\),可以得到:
\[ p_i^TK^{-T} R R^T K^{-1} p_j = p_i^TK^{-T} K^{-1} p_j = 0\]
这样两个消失点可以构建一个内参K的方程。
相机内参矩阵K可以表示为
\[ \left[ \begin{matrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{matrix}\right] \]
这样有3个参数,三个消失点两两配对有三组,可以建立3个方程,求出K
然而具体求解时消失点在图像平面上也可能是无穷远:

第一种情况下相机坐标系和世界坐标系轴方向一致,两个消失点在图像平面上为无穷远,此时我们得到图像平面上一个有限的消失点,两个无穷远的消失点。此时只能标定光心距——有限的消失点位置\((u_0, v_0)\)即为内参\(u_0, v_0\)。
求解外参旋转:
\[\lambda_i p_i = K R e_i = KR_i\]
根据\(\|R_i\|=1\)可以求出\(\lambda_i=\frac{1}{\|K^{-1}p_i\|}\)
\[ \left [ \begin{matrix} \lambda_1 p_1 & \lambda_2 p_2 & \lambda_3 p_3 \end{matrix} \right] = KR\]
\[ R = K^{-1} \left [ \begin{matrix} \lambda_1 p_1 & \lambda_2 p_2 & \lambda_3 p_3 \end{matrix} \right] \]
参考文献
[1] Temporally Consistent Horizon Lines
[2] https://www.cs.princeton.edu/courses/archive/fall13/cos429/lectures/11-epipolar