0%

3D Vision: Camera Model and Calibration

Camera Imaging Model

相机模型解释了如何从世界坐标系下的一个 3D 点映射到成像平面中的一个 2D 点。我们假设相机为线性模型(即相机是原始的小孔相机,显然不合理,但是先这样吧)。成像的过程如下图:

alt text

Extrinsic Parameters

首先要清楚相机相对于世界坐标下的位姿。这就用到了在机器人学里学的齐次坐标变换矩阵:
\[
T =
\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}
\]

其中,
\[
R =
\begin{bmatrix}
r_{11} & r_{12} & r_{13} \\
r_{21} & r_{22} & r_{23} \\
r_{31} & r_{32} & r_{33} \\
\end{bmatrix}
\]

就是旋转矩阵,表示世界坐标轴在相机坐标中的位姿,而向量

\[
t =
\begin{bmatrix}
t_{x} \\
t_{y} \\
t_{z} \\
\end{bmatrix}
\]

表示平移向量,即世界坐标原点在相机坐标中的位置。这样有了齐次坐标变换矩阵,我们就可以把世界坐标转换为相机坐标了。

\[
\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}
\]

即:

\[
\textbf{x}_c = M_{ext} \textbf{x}_w
\]

而这个齐次坐标变换矩阵,被称为相机的外参矩阵。

Intrinsic Parameters

相机的内参矩阵解决如何将相机坐标系下的 3D 点映射到成像平面的 2D 点,即 $(x_c, y_c, z_c) \rightarrow (u, v) $. 根据几何关系

\[
\frac{z_c}{f} = \frac{x_c}{u}
\]

\[
\frac{z_c}{f} = \frac{y_c}{v}
\]

注意在相机坐标中,单位常选作 pixel (而非米), 且坐标的原点常选在左上角,因此要对结果作缩放和平移:

\[
u = m_x f \frac{x_c}{z_c} + o_x = f_x \frac{x_c}{z_c} + o_x
\]

\[
u = m_y f \frac{y_c}{z_c} + o_y = f_y \frac{y_c}{z_c} + o_y
\]

$(f_x, f_y, o_x, o_y)$ 被称为相机的内参。然而这个方程并非线性,难以用矩阵表示。因此我们采用了升维的办法(即齐次坐标)。

\[
\begin{bmatrix}
u \\
v \\
1 \\
\end{bmatrix}
= \begin{bmatrix}
\textbf{u} \\
\textbf{v} \\
\textbf{w} \\
\end{bmatrix}
= \begin{bmatrix}
f_x & 0 & o_x & 0 \\
0 & f_y & o_y & 0 \\
0 & 0 & 1 & 0
\end{bmatrix}
\begin{bmatrix}
x_c \\
y_c \\
z_c \\
1
\end{bmatrix}
\]

注意,这个矩阵乘出来最后一维不一定是1,这时候将齐次坐标缩放,将最后一维调为1. 这个矩阵称为相机的内参矩阵,记为 $M_{int}$。因此:

\[
\textbf{u} = M_{int} \textbf{x}_c = M_{int} M_{ext} \textbf{x}_w = P \textbf{x}_w
\]

即可实现从世界坐标到相机坐标的变换,$P = M_{int} M_{ext}$ 称为投影矩阵。

Camera Calibration

相机工作前,首先要进行内外参标定。观察$P = M_{int} M_{ext}$,可以发现内参矩阵为一个上三角阵,而外参矩阵是一个正交阵,因此给定投影矩阵 $P$, 我们可以利用 RQ 分解确定唯一的一组上三角阵与正交阵,使他们乘积为 $P$, 这样也就确定了所有的外参和内参。因此问题转化为如何确定投影矩阵 $P$.

首先,我们找一个几何形状已知的物体,这样它在世界坐标系下的坐标和在相机坐标系下的坐标就都是已知的,如下:
alt text
把这个式子全部展开,换一种写法,写成:

\[
\textbf{A} \textbf{p} = \textbf{0}
\]

其中 $\textbf{A}, \textbf{p}$ 由下面给出:
alt text

这就变成了求齐次线性方程组的解了,然而这显然有无穷多组解(且它们线性相关)。这对应着我们把物体放大一倍,且拉远一倍,所得到的像不变。或者从齐次坐标去理解,齐次坐标扩大 $k$ 倍,不影响实际的 $u, v$ 值,因为总是要归一化的。因此解此方程需要加上规范条件,有两种:

\[
p_{34} = 1
\]

或:

\[
||\textbf{p}|| ^ 2 = 1
\]

采用第二种规范,问题等价于这样的优化问题:

\[
\min_{\textbf{p}} ||\textbf{Ap}|| ^ 2 \\
\mathrm{s.t.} ||\textbf{p}|| ^ 2 = 1 \\
\]

等价于:

\[
\min_{\textbf{p}} \textbf{p}^\textbf{T}\textbf{A}^\textbf{T} \textbf{Ap} \\
\mathrm{s.t.} \textbf{p}^\textbf{T}\textbf{p} = 1 \\
\]

等价于优化这个损失函数:

\[
L(\textbf{p}, \lambda) = \textbf{p}^\textbf{T}\textbf{A}^\textbf{T} \textbf{Ap} - \lambda (\textbf{p}^\textbf{T}\textbf{p} - 1)
\]

使导数为0,得到:

\[
\textbf{A}^\textbf{T} \textbf{Ap} = \lambda \textbf{p}
\]

这就是一个求特征值的问题了,我们求得 $\textbf{A}^\textbf{T} \textbf{A}$ 的特征值后,找到最小的那个(这里有问题,不知道为啥最小的那个特征值对应着损失函数的极小值,这里没有给出证明,姑且先记住吧),然后求其特征向量,再将特征向量归一化,重新排布,就可以得到 $P$ 矩阵,再作 RQ 分解,即可确定相机的全部外参和内参。

Stereo Matching

相机标定完成后,我们想办法利用相机的二维图像重建三维世界,一种简单的想法是,拿同样一个相机,在平移前后拍两张照片,然后根据同一点在两张照片上的不同位置 (disparity) 推算出这一点的真实位置。原理如下:

alt text

直接根据小孔相机模型写出两种相机下某一点的坐标,然后假设内参和相机坐标系下的坐标已知,解算出真实世界中的坐标。

alt text

值得注意的是,$z$ 与 disparity 成反比,这也与我们的经验相符。比如手指放在双眼中间,当手指离眼睛比较远的时候,两眼看到的手指位置几乎一样,而当手指很贴近鼻子的时候,两眼看到的手指位置完全相反。因此,我们只要找到两张图片中同一个点,就能根据以上公式算出它的位置。找到这两个点的过程被称为 stereo matching. 有以下几点细节:

  1. 由于$v_r$ 与 $v_l$ 一样,所以两张照片上相同的点必然纵坐标相同,因此只用扫描横着的一排区域即可。

  2. Stereo matching 匹配并不是一个点,而是一个区域,区域的大小选择是一个要调的参数,区域太大了,那么确定点的过程误差较大,区域太小了,匹配的准确性不好,有很多区域可能算出来差别都很小。

  3. 计算区域与区域的差别就是单点的差别再对区域求和,常见的几种差别计算方法如下:

alt text