课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 。视频评论区可以找到课程所使用课件与练习题的下载地址。
第3章介绍了透视投影、相机内参、畸变矫正、原像与余像的概念。
1. 数学表示
1.1 从相似三角形开始
用一张图表示相机成像的光学过程(小孔成像)。
图中 \(F_l\) 与 $ F_r $ 是焦点,焦点即垂直通过透镜的光线的汇集点。
图中蓝色标明的三角形与红色标明的三角形相似:
\[ {Y \over y} = - {Z \over f} \]
同理在像平面另一个方向 \(X\) 轴上也有三角形相似:
\[ {X \over x} = - {Z \over f} \]
式子中存在负号是因为成的像是倒像,与原像是中心对称的关系。这样计算很不方便,于是将成像平面从焦点 \(F_r\) 的后侧移动到焦点的前侧,并且翻转,于是有:
\[ \begin{cases} x = f{X \over Z} \\ y = f{Y \over Z} \end{cases} \]
翻转之后的成像如下所示:
总结一下,透视投影是将三维点坐标投影到平面形成二维点坐标:
\[ \pi: \mathbb{R}^3 \rightarrow \mathbb{R}^2; \mathbf{X} \mapsto \mathbf{x} = \pi(\mathbf{X}) = \begin{bmatrix} f {X \over Z} \\ f {Y \over Z} \end{bmatrix} \]
以上是使用薄透镜时的透视原理,使用厚透镜时光线在透镜内部存在不可忽略不计的折射,需要进行变形纠正。
1.2 矩阵表示
将投影过程在齐次坐标下用矩阵表示:
\[ Z \mathbf{x} = Z \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} = K_f \Pi_0\mathbf{X} \]
这里引入了两个新的矩阵 $ K_f, \Pi_0 $:
\[ K_f \equiv \begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{bmatrix}; \Pi_0 \equiv \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \]
$ \Pi_0 $ 被称作标准投影矩阵(Standard Projection Matrix),作用是将齐次坐标转化为非齐次坐标。
假设物体离相机很远,其景深 \(Z\) 为常数 \(\lambda\)。景深一定是正数,因为相机成像的物体在焦点(上图中的 $ F_l $)之前,所以有 $ \lambda \gt 0 $。我们得到投影过程的简洁形式:
\[ \lambda \mathbf{x} = K_f\Pi_0\mathbf{X} \]
其中 \(\mathbf{x}\) 是相机投影平面坐标(单位m),\(\mathbf{X}\) 是三维点在相机坐标系中的坐标。
1.3 从世界坐标系到相机投影平面
上式中的 \(\mathbf{X}\) 是相机坐标系坐标,将相机的位姿加入考虑范围,求世界坐标系坐标到相机投影平面坐标系的坐标。
由上一章的内容可知,相机当前坐标系坐标与世界坐标系坐标之间的转换关系如下:
\[ \mathbf{X} = g\mathbf{X_0} = \begin{bmatrix} R & T \\ 0 & 1 \end{bmatrix}\mathbf{X_0} \]
所以从世界坐标系坐标到相机投影平面坐标系坐标的转换关系为
\[ \lambda \mathbf{x} = K_f\Pi_0g\mathbf{X_0} \]
还可以做进一步的简化,如果将相机投影平面坐标系的单位长度设置为焦距 \(f\),那么 \(K_f\) 为单位阵,公式可化简为
\[ \lambda \mathbf{x} = \Pi_0g\mathbf{X_0} \]
2. 相机内参
上面的公式推导是世界坐标系坐标转化为相机投影平面坐标系坐标,相机投影平面坐标系坐标的单位是 m,但使用相机拍摄的影像时我们读取的是像素坐标,所以还需要进一步的坐标转换。进一步的坐标转换如下:
\[ \lambda \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} s_x & s_{\theta} & o_x \\ 0 & s_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} \]
这里引入了新的矩阵 \(K_s\)
\[ K_s \equiv \begin{bmatrix} s_x & s_{\theta} & o_x \\ 0 & s_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \]
矩阵 $ K_s $ 中各个参数的解释如下:
- \(o_x, o_y\) 相机相主点在相机投影平面坐标系下的像素坐标,单位为 pixel;
- \(s_x (s_y)\) 在 \(x(y)\) 方向上单位长度包含的像素个数,单位为 pixel / m;
- \(s_{\theta}\) 在像素形状为矩形时值为0,像素形状为平行四边形时值不为0,一般像素形状都为矩形,该值为0。
定义相机内参矩阵为
\[ K \equiv K_sK_f = \begin{bmatrix} fs_x & fs_{\theta} & o_x \\ 0 & fs_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \]
将 $ K $ 代入上面的公式
\[ \lambda \mathbf{x'} = K\Pi_0\mathbf{X} = K\Pi_0g\mathbf{X_0} \equiv \Pi \mathbf{X_0} \]
这里定义了一个新的矩阵 \(\Pi \equiv K \Pi_0 g = \begin{bmatrix} KR & KT \end{bmatrix}\) ,称作一般投影矩阵(General Projection Matrix),可将世界坐标转化为像素坐标。
3. 球面投影
小孔相机的透视模型是将影像投影在平面上,同样的影像也可以投影在球面上。
将影像投影到单位球面 $ \mathbb{S}^2 \equiv \left{x \in \mathbb{R}^3 \right.\left | |x| = 1\right} $ 上,球面投影 \(\pi_s\) 可以表示为
\[ \pi_s: \mathbb{R}^3 \rightarrow \mathbb{S}^2; \mathbf{X} \mapsto \mathbf{x} = {\mathbf{X} \over \| \mathbf{X} \|} \]
\[ \lambda \mathbf{x'} = K\Pi_0g\mathbf{X_0} \]
其中 $ \lambda = | \mathbf{X} | = \sqrt{X^2 + Y^2 + Z^2} $
4. 径向畸变
径向畸变(Radial Distortion)是影像中以 \((o_x, o_y)\) 为中心的投影畸变,投影畸变发生在以该点为起点的射线上。畸变影像上距离该点距离相同的点,在正常影像上距离该点的距离也相同,即镜像畸变保持到 $ (o_x, o_y) $ 的距离不变。
下图是径向畸变的示意(图片来源 TUM 课程 Slides):
径向畸变是非线性畸变(需要平方坐标以计算径向距离),使用多项式拟合径向畸变以纠正。
\[ \begin{cases} x = x_d (1 + a_1 r^2 + a_2 r^4) \\ y = y_d (1 + a_1 r^2 + a_2 r^4) \end{cases} \]
$ \mathbf{x_d} \equiv (x_d, y_d) $ 是畸变影像的投影平面坐标,$ (x, y) $ 是纠正后的像素坐标,$ r^2 = x^2_d + y^2_d $。这个公式纠正径向畸变需要先使用相机内参矩阵将确定相机成像中心的像素坐标,从而确定相机投影平面坐标系,量测出正确的 $ \mathbf{x_d} $ 。
一种*度更高的投影纠正模型如下
\[ \mathbf{x} = c + f(r)(\mathbf{x_d} - \mathbf{c}); f(r) = 1 + a_1 r + a_2 r^2 + a_3 r^3 + a_4 r^4 \]
$ r = | \mathbf{x_d} - \mathbf{c} | $ 是影像点距离任意一中心点 $ \mathbf{c} \(的距离,\)\mathbf{c}$ 是一个待求量。
计算径向畸变参数利用现实世界中的直线(图中的书架存在直线),本应是直线的线在影像中却是弧线,使用这种对应关系进行计算。
5. 原像与余像
原像(Preimage)的意义与函数映射中的原像类似。
原像是相对于影像中的一个像(比如说影像中的一个点,或一条线,或一个形状)在现实世界中对应的区域。可以用函数映射的方式进行理解,假设有函数 \(y = f(x)\),$ y $ 的原像就是 \(x\)。本质上投影就是 $ \pi: \mathbb{R}^3 \rightarrow \mathbb{R}^2 $ 的过程,这就是一个函数映射。
余像(Coimage)在函数映射中我也不清楚。在线性代数中是与原像共同组成整个线性空间的向量。
在讨论原像与余像之前,需要了解空间中的一条直线如何定义。空间中的一条直线 \(L\) 可以通过直线上的一点 $ \mathbf{X_0} = (X_0, Y_0, Z_0, 1)^T \in \mathbb{R}^4 $ 和一个方向 $ \mathbf{V} = (V_1, V_2, V_3, 0)^T $ 定义:
\[ \mathbf{X} = \mathbf{X_0} + \mu \mathbf{V}, \mu \in \mathbb{R} \]
这条直线的像可以用投影公式给出:
\[ \mathbf{x} \sim \Pi_0 \mathbf{X} = \Pi_0(\mathbf{X_0} + \mu \mathbf{V}) \]
将所有的点 \(\mathbf{x}\) 当做向量,这些向量张成的二维子空间是直线 \(L\) 的原像。对应的,与该二维子空间垂直的向量是直线 \(L\) 的余像。
成像平面上的一条直线 \(L\) 一般使用其余像进行描述,假设其余像为 $\mathscr{l} \in \mathbb{R}^3 $,余像与原像垂直,直线上的点 \(\mathbf{x}\) 在原像中,所以有
\[ \mathscr{l}^T \mathbf{x} = 0 \]
直线 \(L\) 的原像是与其余像垂直的平面,设其原像是 \(P\),则
\[ P = span(\hat{\mathscr{l}}) \]
\[ \hat{\mathscr{l}}\mathscr{l} = \mathscr{l} \times \mathscr{l} = 0 \]
$ \mathscr{l} $ 的秩为2,其张成的线性空间的维度为2,表示一个平面。
同理可知影像上一个点 \(\mathbf{x}\) 的原像与余像。
影像上点的原像是一条射线,连接相机成像中心与影像上这一点形成的射线。如图所示,图中红色点的原像是图中绿色的射线,绿色射线上的点经投影形成的像是红色的点。绿色射线是三维线性空间的一维子空间,可以用一个向量表示。图中红色点的余像是与其原像垂直的二维子空间(平面),在图中未画出。
影像上线的原像是一个平面,取影像线的两个端点,分别做从成像中心到这两个点的连线形成两条射线。如图所示,取红色线的两个端点,连接相机成像中心到这两个点,形成两条蓝色射线,夹在两条射线间面上的点经投影会落在影像线上。直线的原像是这两条蓝色射线对应向量张成的二维子空间,余像是一维子空间。
最后整理一下像(image)、原像(preimage)、余像(coimage)之间的关系(表格图片来源 TUM 课程 Slides):
\[ image = preimage \cap image plane, \quad preimage = span(image) \]
\[ preimage = coimage^{\bot}, \quad coimage = preimage^{\bot} \]
6. 透视几何
在齐次坐标系下可以使用一个四维向量的集合表示一个三维点:
\[ \mathbf{X} = (XW, YW, ZW, W) \in \mathbb{R}^4 \]
这种表示方法中只有方向是重要的,比例系数 \(W\) 不重要。对于所有的 \(W \in \mathbb{R}\) 的取值,$ \mathbf{X} $ 表示同一个点。这些所有只有 $ W $ 不同的向量只相差一个数值因数,它们被称为相等(equivalent):
\[ \mathbf{X} \sim \mathbf{Y} \]
An n-dimensional projective space $ \mathbb{P}^n $ is the set of all one-dimensional subspaces (i.e. lines through the origin) of the vector space \(\mathbb{R}^{n+1}\).
上面这一句话的意思是 n 维透视空间是 n+1 维线性空间的所有 1 维子空间的集合。可以想象从原点引出无数条射线(像刺猬一样,当然刺猬的身体不是一个点),同一条射线上的线在透视空间中是等价的,所以 2 维透视空间是三维透视空间这些射线的集合,3 维线性空间不同射线相当于 2 维透视空间中的一个点。
但是对于现实世界的三维线性空间 \(\mathbb{R}^3\) 对应的透视空间是 $ \mathbb{P}^2 $。
表示透视空间中的一个点有两种方式:
- 对应着小孔成像的平面投影,将三维点投影到一个平面上,平面上的 \(z\) 处处相等,所以点坐标表示为 $ (x, y, z), z = constant $;
- 对应着球面投影,将三维点投影到一个单位球面 \(\mathbb{S}^2\) 上,球面上所有点的范数相等,所以点坐标表示为 $ (x, y, z), \sqrt{x^2 + y^2 + z^2} = 1 $。