本文从经典的针孔相机模型开始,推导出相机的几何模型。这个模型描述了如何把三维场景中的坐标转换到二维图像上。只有理解了这个模型,我们才有可能从二维的图像反向推测三维世界,也就能够实现三维重建的过程。
参考资料:
计算机视觉 鲁鹏 清晰完整合集
小孔成像原理
针孔模型是相机最理想的模型,针孔成像的示意图如下:
从物体上反射的光线呈现散射状态,其中大部分都被隔板所遮挡,少部分通过针孔,照射在胶片上。在理想的针孔模型下,物体上的每个点仅有一条光线能够通过针孔,每个点都通过针孔投射在胶片上,形成了一个清晰的倒立的像。
针孔相机模型推导
我们利用针孔成像原理制造出如下的相机结构:
图中,蜡烛上各个点通过针孔投射到像平面上,形成蜡烛倒立的清晰成像。f表示针孔到像平面的距离,通常称为相机的焦距。o表示针孔/光圈位置。
在实际对相机模型进行研究时,我们会构建一个虚拟像平面,主要是为了分析问题方便,以及取消正负号的影响。
构建摄像机坐标系
以针孔o所在位置为摄像机坐标系的原点,建立起摄像机坐标系,从三维世界上的P点,经过针孔成像到P'点,如图所示:
在这个摄像机坐标系下,我们找到 P(x,y,z) 到 P'(x',y',z')的映射,也就是给定一个P点,希望找到P‘点。
\[P=(x,y,z)\rightarrow P'(x',y',z')\]
由于P’点在k方向的坐标是固定的 f(P‘永远都只能在像平面上成像,像平面就是z = f 平面),因此,我们要找的映射关系变成:
\[P=(x,y,z)\rightarrow P'(x',y',f)\]
这里关键是要找x'和y'的值。可以通过相似三角形法很容的找到它们之间的关系:
上图是我们沿着i的负方向看过去的一个切面,通过相似三角形可以得到y'关于f,y,z的表达式;
同理,可以得到x'关于f,x,z的表达式:
\[\begin{cases} x' = f\frac{x}{z}\\ y' = f\frac{y}{z} \end{cases}\]
注意!以上的转换我们都是在摄像机坐标系下进行的
引入像平面坐标系
此时,我们引入像平面坐标系,以像平面C’点作为原点,同样以i和j方向作为坐标轴,建立像平面坐标系,此时P‘点在像平面坐标系下的坐标值其实就是刚才我们在i,j,k摄像机坐标系下i,j方向的分量,也就是x’和y‘。
这样我们就完成了三维点P(摄像机坐标系)到二维点P’(像平面坐标系)的映射
\[P=\begin{bmatrix} x\\ y\\ z \end{bmatrix}\rightarrow P'=\begin{bmatrix} x'\\ y' \end{bmatrix}=\begin{bmatrix} f\frac{x}{z}\\ f\frac{y}{z} \end{bmatrix}\]
通过这个比例关系,我们可以看到P‘点的坐标在f值固定的前提下(对于特定的一台相机,f是固定不变的)取决于一个比例关系,也就是x/z和y/z。
假如我们让图中的P点沿着红色箭头方向移动,虽然坐标值x,y,z都在变化,但这两个比值是不变的,因此对应的P‘也就没有变化。
引入像素坐标系
在数字图像中,通常坐标系的原点不是在中心,而是在图片的一个角落;此外,数字图像的单位是pixel,而像平面的单位是m。因此,还需要从这两个方面完善这个模型,使得模型能够从三维点P,映射到数字图像上的某一个像素。
偏置
像平面坐标系原点位于中心,图片的坐标系原点位于图片一个角落,因此,从像平面坐标系转换到图像坐标系时,应当加一个平移项(Cx, Cy):
\[(x,y,z)\rightarrow (f\frac{x}{z}+c_x,f\frac{y}{z}+c_y)\]
单位变换
对像平面上的坐标乘以单位变换 k、l (pixel / m),得到图像坐标,实现单位变换:
\[(x,y,z)\rightarrow (f k\frac{x}{z}+c_x,f l\frac{y}{z}+c_y)\]
内参整理
此时的模型中,f是相机焦距,k、l是单位转换项,它们在相机确定时,是固定不变的,是相机的内部参数。因此,为了简化模型,用α和β表示fk和fl。
用α和β来表示相机内部确定参数,映射关系变成了:
\[P=(x,y,z)\rightarrow P'=(\alpha\frac{x}{z}+c_x,\beta\frac{y}{z}+c_y)\]
线性or非线性变换?
观察这个模型,从(x,y,z)到(x‘,y’)的变换是一个非线性变换。这是因为x' = αx/z+Cx表达式中,关于x的系数还引入了z这个变量。
z作为一个变量:x的变化,z也会跟着变,因为x,y,z本质上是三维物体表面的点,当x移动,表示物体表面的点发生了移动,那么z大概率是要变化的。
为了使得后续分析更加简便,我们需要将其转化为线性变换。在计算机视觉和图形学领域中,我们通常将这种欧式坐标转化成齐次坐标进行分析。
引入齐次坐标
欧式坐标到齐次坐标很简单,增加一个维度,设置为1即可。如下分别是二维点和三维点的齐次坐标
\[(x,y)\Rightarrow\begin{bmatrix} x\\ y\\ 1 \end{bmatrix}\qquad(x,y,z)\Rightarrow\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}\]
齐次坐标到欧式坐标则需要用前面的维度除以最后一个维度得到。
\[\begin{bmatrix} x\\ y\\ w \end{bmatrix}\Rightarrow(x/w,y/w)\qquad\begin{bmatrix} x\\ y\\ z\\ w \end{bmatrix}\Rightarrow(x/w,y/w,z/w)\]
三维齐次空间的点,除掉第三维,得到二维欧氏空间。
从计算公式可以看出,一个欧式空间下的坐标,对应着不止一个齐次空间的坐标,齐次坐标之间相差一个系数。比如,欧式空间中的点(2, 3),对应齐次坐标(2, 3, 1),同时也对应齐次坐标(4, 6, 2),也对应齐次坐标(2k, 3k, k)
在齐次坐标空间中对向量进行放大和缩小,是不改变其对应的欧式空间坐标的。
二维欧式空间中的一个点,到三维齐次空间中的一条线。
齐次坐标系中的投影变换
上文中得到的欧氏空间变换模型为:
\[P=(x,y,z)\rightarrow P'=(\alpha\frac{x}{z}+c_x,\beta\frac{y}{z}+c_y)\]
我们把P'转换到齐次坐标(加一个第三维,再统一放大z倍),可以整理得到如下模型:
\[P_h'=\begin{bmatrix} \alpha x + c_xz\\ \beta y + c_yz\\ z \end{bmatrix}=\begin{bmatrix} \alpha & 0 & c_x & 0\\ 0 & \beta & c_y & 0\\ 0 & 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}\]
这其中,右侧刚好出现了P的齐次坐标:
\[P_h=\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}\]
通常情况下我们描述坐标转换时都采用齐次坐标来描述,因此可以隐掉下标h,得到齐次坐标下P到P'的转换模型:
\[P'=\begin{bmatrix} \alpha & 0 & c_x & 0\\ 0 & \beta & c_y & 0\\ 0 & 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}=MP\]
修正工艺缺陷
由于相机制造工艺问题,它的成像像素可能不是边角维90度的正方形,其角度θ可能如图所示小于90度。考虑到这个因素,我们修正这个模型:
\[P'=\begin{bmatrix} \alpha&-\alpha\cot\theta&c_x&0\\ 0&\beta/\sin\theta&c_y&0\\ 0&0&1&0 \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}=MP=K\begin{bmatrix}I & 0\end{bmatrix}P\]
其中M为投影矩阵:
\[M=\begin{bmatrix} \alpha&-\alpha\cot\theta&c_x&0\\ 0&\frac{\beta}{\sin\theta}&c_y&0\\ 0&0&1&0 \end{bmatrix}\]
K为摄像机内参数矩阵:
\[K=\begin{bmatrix} \alpha&-\alpha\cot\theta&c_x\\ 0&\frac{\beta}{\sin\theta}&c_y\\ 0&0&1 \end{bmatrix}\]
K中的各个元素都是摄像机内部参数相关,是相机确定后就不会发生变化的。它具有5个相互独立的变量,因此自由度为5。
规范化摄像机
如果K是单位矩阵,那么该相机就是一个规范化相机,该相机在现实中是不存在的,但这个概念模型可以帮助我们后续的很多问题的分析:
\[P'=\begin{bmatrix} x\\ y\\ z \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}\]
在这个模型中,只要知道了二维点的坐标,就能直接得到三维点的坐标,当然,由于欧式坐标和齐次坐标的一对多的关系,可以得到很多个三维点坐标
引入世界坐标系
在描述物体坐标时,通常是在世界坐标系下进行描述,这样有利于我们把握各个物体、相机之间的位置关系。而我们之前的讨论P是在摄像机坐标系下的坐标,因此,还需要完成世界坐标到相机坐标的转换:
\[P=\begin{bmatrix} R&T\\ 0&1 \end{bmatrix}\boldsymbol{P}_w\]
其中Pw为世界坐标的齐次坐标:
\[P_w=\begin{bmatrix} x_w\\ y_w\\ z_w\\ 1 \end{bmatrix}\]
完整的相机模型
将其代入前文中的模型,得到:
\[P' = K\begin{bmatrix}I&0\end{bmatrix}P=K\begin{bmatrix}I&0\end{bmatrix}\begin{bmatrix}R&T\\0&1\end{bmatrix}P_w=K\begin{bmatrix}R&T\end{bmatrix}P_w = MP_w\]
这样就完成了世界坐标中的三维点到图像坐标上的二维点之间的映射关系。
其中:
K是相机内部参数决定的内参矩阵。其维度为3X3
R、T是相机在世界坐标系中所在位置决定,为相机外参矩阵。其维度为3X4
M是K、R、T共同构建的投影矩阵。其维度为3X4
M投影矩阵的自由度,由K、R、T的自由度决定:5 + 3 + 3 = 11
如果把M矩阵写成行向量的形式:
\[M=\begin{bmatrix} m_1\\ m_2\\ m_3 \end{bmatrix}\]
运用这个模型,如果已知M和Pw,就能写出P‘点的欧式坐标,完成从三维向二位像素的转换。
\[P' = MP_w=\begin{bmatrix} m_1\\ m_2\\ m_3 \end{bmatrix}P_w=\begin{bmatrix} m_1P_w\\ m_2P_w\\ m_3P_w \end{bmatrix}\rightarrow (\frac{m_1P_w}{m_3P_w},\frac{m_2P_w}{m_3P_w})\]
小孔成像模型本质上是一种透视投影。根据小孔成像的原理,光线通过小孔后会在成像平面上形成倒立的实像,这种成像过程可以用几何光学中的透视投影来描述,也符合近大远小的现象。
引入透镜
上面我们已经推导出了完整的相机模型,这个模型是通过小孔相机进行推导的,而现实中我们的相机都不是小孔相机。那影响我们之前的推导结论吗?
首先,我们看小孔成像的弊端,对于理论上的的小孔来说,只能通过一条光线,也就是胶片上只能接受到物体各个点投射过来的一条光线,其成像是清晰的。然而,实际当中,小孔必然是有一定大小的,物体上每个点投射过来的是一条光束,或者叫光锥,每个点在胶片上投射的是一个具有大小的光斑。各个点投射过来的光斑相互重叠,因此胶片上会出现如下模糊的成像。
下面是一些孔径大小不同的小孔成像展示,通过这个展示我们看到孔径越小,图像越清晰。那我们把孔径做的足够小是不是就能解决问题呢?很遗憾,随着孔径减小,投射过来的光总量也变小了,图片的亮度太低,成像质量也很差。
因此,我们需要引入透镜原理进行成像,现实中的相机镜头都是透镜组成的。
透镜的光学原理能够让更多同一个点发射出的光线汇聚到胶片的一个点上。这样,清晰度也有了,亮度也能够保证。
透镜投影的几何光学如图:
从图中可知:
从图中可知,虽然透镜产生了一堆的折射光线,但过透镜中心的光线是不改变方向的,这个中心的光线就类比于小孔成像中过小孔的光线,同样的,根据相似三角形原理,可以得到和小孔成像一致的结论:
\[\begin{cases} x' = z'\frac{x}{z}\\ y' = z'\frac{y}{z} \end{cases}\]
其中:
\[z' = f + z_0\]
注意!这里的f是透镜的焦距,和前文中的相机焦距是两个概念。
把z'看成前文中的相机焦距,透镜成像就和小孔成像完全一致了。所以前文中讨论的转换模型依然成立。
引入透镜对成像结果有着积极作用,然而它也带来了一些问题,需要我们在建立模型时考虑进去。
失焦问题
如图,如果物体上的点无法在胶片上汇聚到一点时,就会产生失焦问题,这与物体距离相机的距离有关。往往物体只有在一定的距离上才能有一个清晰的成像。这也带来了相机景深的概念。
径向畸变
由于相机透镜的制作工艺问题,光线在其边缘区域可能发生不规则折射,产生如下的枕形和桶形畸变。
畸变作用会沿着径向方向将原始点向内拉(形成桶形畸变),或向外推(形成枕形畸变),由于透镜是圆形,因此畸变的程度从圆心开始沿着径向方向不断增加。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |