小孔成像
小孔成像是初中物理知识,如图所示,蜡烛发出的光线经过小孔投射在光屏上呈现出倒立的实像。
以上成像过程涉及三个重要对象,即物点(蜡烛本身)、光心(小孔)、像点(光屏上的亮点),三者连起来的直线叫做光路。
小孔成像是理想条件下的相机成像模型。
相机坐标系
为了方便研究,我们可以小孔为坐标原点,建立相机坐标系。
在空间直角坐标系 \(O_c X_c Y_c Z_c\)中,原点 \(O_c\) 为小孔,点 \(M(X_m,Y_m,Z_m)\) 为物点,点 \(P'(X'_p,Y'_p,Z'_p)\) 为像点,于是根据三点满足共线的约束,向量 \(\vec{O_cM}\) 与向量 \(\vec{O_cP'}\) 满足 \(\vec{O_cM} = \lambda' \vec{O_cP'}\),即:
\[(X_m-0,Y_m-0,Z_m-0) = \lambda' (X'_p-0,Y'_p-0,Z'_p-0)
\]
但是,我们会发现,\(\lambda'\) 是负数(因为穿过原点了),所成的像也是倒立的像,不便于建模和对比,于是,将像点 \(P'\) 移动到关于原点对称的点 \(P(X_p,Y_p,Z_p)\)上,使物点像点在同一象限内。由此得到物点坐标与像点坐标之间的关系:
\[\frac{X_p}{X_m} = \frac{Y_p}{Y_m} = \frac{Z_p}{Z_m} = \lambda
\]
此时的 \(\lambda\) 为正数,像也是正立的,有利于后续研究。
这里的坐标系 \(O_cX_cY_cZ_c\) 就是所谓的相机坐标系,他将相机的光心作为坐标原点。
从相机坐标系到图像坐标系
过像点 \(P\) 且平行于 \(O_cX_cY_c\) 平面,建立二维坐标系 \(o_fxy\) ,那么像点\(P(X_p,Y_p,Z_p)\) 在该坐标系下表示为点 \(p(x_p,y_p)\),且满足:
\[\left\{ {\begin{array}{*{20}{c}}
{{X_p} = {x_p}}
\\
{{Y_p} = {y_p}}
\end{array}} \right.
\]
令 \(f=Z_p\),则有:
\[\frac{x_p}{X_m} = \frac{y_p}{Y_m} = \frac{f}{Z_m}
\]
于是,我们可以得到在小孔成像条件下,三维坐标系 \(O_cX_cY_cZ_c\) 中的物点\(M(X_m,Y_m,Z_m)\) 与二维坐标系 \(o_fxy\) 中的像点 \(p(x_p,y_p)\) 之间的坐标转换关系:
\[\left\{ {\begin{array}{*{20}{c}}
{{Z_m}{x_p} = f{X_m}}
\\
{{Z_m}{y_p} = f{Z_m}}
\end{array}} \right.
\]
化为齐次式则可表示为:
\[{Z_m}\left( {\begin{array}{*{20}{c}}
{{x_p}} \\
{{y_p}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
f&0&0&0 \\
0&f&0&0 \\
0&0&1&0 \\
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right)
\]
这里的坐标系 \(o_fxy\) 就是所谓的图像坐标系,其中 \(f\) 为相机的有效焦距,即 三维坐标系 \(O_cX_cY_c\) 与二维坐标系 \(o_fxy\) 的原点距离。
该变换通常被称作透视变换。
从图像坐标系到像素坐标系
拍摄所得到的图像是以矩阵的形式存储起来的,行列索引得到的值即为像素值,在坐标系中占据一个像素(pixel)。对于一幅图像,像素坐标系以图像左上角为坐标原点,单位长度以像素计算。
图像坐标系的原点为图像的中心点处(对角线交点处),在像素坐标系中可表示为 \(o_f(u_0,v_0)\),单位长度以 mm 计算,设行方向上每1个像素对应 \(dx\) 个 mm,列方向上每1个像素对应 \(dy\) 个 mm 。所以对于图像坐标系中的一点 \(p(x_p,y_p)\) ,设其在像素坐标系中的坐标为 \(p(u_p,v_p)\) 。则坐标转换关系为:
\[\left\{ {\begin{array}{*{20}{c}}
{{u_p} = \frac{{{x_p}}}{{dx}} + {u_0}} \\
{{v_p} = \frac{{{y_p}}}{{dy}} + {v_0}}
\end{array}} \right.
\]
转换为齐次式,可表示为:
\[\left( {\begin{array}{*{20}{c}}
{{u_p}} \\
{{v_p}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{\frac{1}{{dx}}}&0&{{u_0}} \\
0&{\frac{1}{{dy}}}&{{v_0}} \\
0&{0}&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{x_p}} \\
{{y_p}} \\
1
\end{array}} \right)
\]
该过程是缩放+平移变换。
从相机坐标系到像素坐标系
前面推导了相机坐标系→图像坐标系,图像坐标系→像素坐标系,实际上二者是连贯的变换关系,可以实现相机坐标系→像素坐标系。
\[\left\{ {\begin{array}{*{20}{c}}
{{Z_m}\left( {\begin{array}{*{20}{c}}
{{x_p}} \\
{{y_p}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
f&0&0&0 \\
0&f&0&0 \\
0&0&1&0 \\
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right)} \\
{\left( {\begin{array}{*{20}{c}}
{{u_p}} \\
{{v_p}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{\frac{1}{{dx}}}&0&{{u_0}} \\
0&{\frac{1}{{dy}}}&{{v_0}} \\
0&{0}&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{x_p}} \\
{{y_p}} \\
1
\end{array}} \right)}
\end{array}} \right.
\]
由上述关系式,推导得到:
\[{Z_m}
\left( {\begin{array}{*{20}{c}}
{{u_p}} \\
{{v_p}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{\frac{1}{{dx}}}&0&{{u_0}} \\
0&{\frac{1}{{dy}}}&{{v_0}} \\
0&0&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
f&0&0&0 \\
0&f&0&0 \\
0&0&1&0 \\
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right)
\]
化简得到:
\[{Z_m}\left( {\begin{array}{*{20}{c}}
{{u_p}} \\
{{v_p}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{\frac{f}{{dx}}}&0&{{u_0}}&0 \\
0&{\frac{f}{{dy}}}&{{v_0}}&0 \\
0&0&1&0 \\
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = {M_1}\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right)
\]
其中 \(M1\) 为相机内参矩阵,其包括了相机有效焦距 \(f\)、尺度因子 \(dx\) 、\(dy\) ,以及图像中心点 \((u_0,v_0)\) ,以上参数只与相机本身有关。
上图通常简化为如下形式,用来表示相机:
从世界坐标系到相机坐标系
实际拍摄过程中,摄像机的姿态可以不一样,因此要描述这种相对变化,需要新的坐标系作为参考系来描述姿态,该新坐标系就是世界坐标系。
在世界坐标系中 \(O_wX_wY_wZ_w\),物体(相机坐标系)可以发生旋转和平移运动,即所谓的刚体变换。
其中旋转分绕 \(X\) 轴、\(Y\) 轴、\(Z\) 轴旋转,平移分沿着 \(X\) 轴、\(Y\) 轴、\(Z\) 轴方向平移。
绕\(X\) 轴旋转 \(\alpha\):
\[\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
1&0&0&0 \\
0&{\cos \alpha }&{\sin \alpha }&0 \\
0&{ - \sin \alpha }&{\cos \alpha }&0 \\
0&0&0&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)
\]
绕 \(Y\) 轴旋转 \(\beta\) :
\[\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
0&{\cos \beta }&{ - \sin \beta }&0 \\
0&1&0&0 \\
0&{\sin \beta }&{\cos \beta }&0 \\
0&0&0&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)
\]
绕 \(X\) 轴旋转 \(\gamma\) :
\[\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{\cos \gamma }&{\sin \gamma }&0&0 \\
{\sin \gamma }&{\cos \gamma }&0&0 \\
0&0&1&0 \\
0&0&0&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)
\]
以上旋转可以连续操作,变换过程可写作:
\[\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{{R_{3 \times 3}}}&{{O_{3 \times 1}}} \\
{{O_{1 \times 3}}}&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)
\]
平移:
\[\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
1&0&0&{{t_x}} \\
0&1&0&{{t_y}} \\
0&0&1&{{t_z}} \\
0&0&0&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)
\]
旋转和平移连续操作,变换过程可写作:
\[\left( {\begin{array}{*{20}{c}}
{{X_m}} \\
{{Y_m}} \\
{{Z_m}} \\
1
\end{array}} \right) = \left( {\begin{array}{*{20}{c}}
{{R_{3 \times 3}}}&{{T_{3 \times 1}}} \\
{{O_{1 \times 3}}}&1
\end{array}} \right)\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right) = {M_2}\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)
\]
其中 \(M_2\) 为相机外参矩阵,记录了相机相对于世界坐标系的旋转和平移情况。
从世界坐标系到像素坐标系
整个成像过程实际经历了以下坐标系变换:
\[世界坐标系→相机坐标系→图像坐标系→像素坐标系
\]
整个变换过程可写作:
\[{{Z_m}\left( {\begin{array}{*{20}{c}}
{{u_p}} \\
{{v_p}} \\
1
\end{array}} \right) = {M_1}{M_2}\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right)}
\]
物理世界的三维信息被记录到二维图像中,丢失了一个维度的信息,因此要尝试从图像中测量出物理世界尺寸,则需要计算变换矩阵 \(M_1\) 与 \(M_2\),这就涉及到相机内外参矩阵的计算,也叫做相机标定。
标定结束后,可根据拍摄的图像测算现实世界中的物理尺寸,该过程相当于:
\[像素坐标系→图像坐标系相→机坐标系→世界坐标系
\]
即:
\[\left( {\begin{array}{*{20}{c}}
{{X_w}} \\
{{Y_w}} \\
{{Z_w}} \\
1
\end{array}} \right) = {Z_m}M_2^{ - 1}M_{_1}^{ - 1}\left( {\begin{array}{*{20}{c}}
{{u_p}} \\
{{v_p}} \\
1
\end{array}} \right)
\]
总结