第5讲 相机与图像

先笼统的看看图像是怎么形成的:在计算机中,一张照片由很多个像素组成,每个像素记录了色彩或者亮度的信息。三维世界中的一个物体反射或发出的光线,穿过相机光心后,投影在相机的成像平面上。相机的感光器件接收到光线后,产生测量值,就得到了像素,形成了我们见到的照片。

相机模型

相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程可以用一个几何模型来进行描述。

这个模型有很多种,其中最简单的就是针孔模型,它描述了一束光线通过针孔之后,在针孔背面投影成像的关系。

同时,由于相机镜头上的透镜的存在,使得光线投影到成像平面的过程中会产生畸变

相机的针孔模型+透镜的畸变模型可以把外部的三维点投影到相机内部成像平面,构成相机的内参数。

针孔相机模型

先来看一个实验(初中实验,隐隐约约的有点印象):在一个暗箱的前方放着一支点燃的蜡烛,蜡烛的光透过暗箱上的一个小孔投影在暗箱的后方平面上,并在这个平面上形成一个倒立的蜡烛图像。我们用下图来描述这个模型。

现在,我们来对这个模型进行几何建模:

o-x-y-z为相机坐标系(习惯上,我们让z轴向前,x轴向右,y轴向下),O为相机光心,也就是针孔模型中的针孔。

现实世界的三维点p,经过针孔O投影之后,落到物理成像平面o^{'}-x^{'}-y^{'}上,成像点为p^{'}

p的坐标为(x,y,z)^{T}p^{'}的坐标为(x^{'},y^{'},z^{'})^{T},并且设物理成像平面到针孔的距离为f(焦距)。

根据三角形相似,可以得到:

\frac{Z}{f}=-\frac{X}{X^{'}}=-\frac{Y}{Y^{'}}   (负号表示成的像是倒立的)

为了简化模型,我们可以把成像平面对称到相机前方,和三维空间点一起放在摄像机坐标系的同一侧,如下图:

于是就可以把上式中的负号去掉,得到:

\frac{Z}{f}=\frac{X}{X^{'}}=\frac{Y}{Y^{'}}

整理一下,得到:

\left\{\begin{matrix} X^{'}=f\frac{X}{Z} \\ Y^{'}=f\frac{Y}{Z} \end{matrix}\right.

上式描述了点p和它的像之间的空间关系。但是,在相机中,我们最终获得的是一个个的像素,这需要在成像平面上对像进行采样和量化。

为了描述传感器将感受到的光线转换成图像像素的过程,我们需要假设一个像素坐标系像素坐标系通常的定义方式是:原点{\color{Red} O^{'}}位于图像的左上角,{\color{Red} u}轴向右和x轴平行,{\color{Red} v}轴向下和y 轴平行,像素坐标系和成像平面之间,相差了一个缩放和一个原点的平移,我们设像素坐标在{\color{Red} u}轴上缩放了{\color{Red} \alpha}倍,在{\color{Red} v}轴缩放了{\color{Red} \beta}倍,原点平移了{\color{Red} (C_{x},C_{y})^{T}})。我们假设在物理成像平面上固定着一个像素平面o-u-v,在像素平面上得到的p^{'}的像素坐标为(u,v)^{T}

那么,p^{'}的坐标和像素坐标之间的关系为:

\left\{\begin{matrix} u=\alpha X^{'}+C_{x} \\ v=\beta Y^{'}+C_{y} \end{matrix}\right.

X^{'}=f\frac{X}{Z}Y^{'}=f\frac{Y}{Z}代入得:

\left\{\begin{matrix} u=\alpha f \frac{X}{Z}+C_{x} \\ v=\beta f \frac{Y}{Z}+C_{y} \end{matrix}\right.

注意,缩放因子和焦距是相机出厂的时候就已经决定了的。我们把af合并为f_{x}\beta f合并为f_{y},得到:

\left\{\begin{matrix} u=f_{x} \frac{X}{Z}+C_{x} \\ v=f_{y} \frac{Y}{Z}+C_{y} \end{matrix}\right.

f的单位是米,\alpha ,\beta的单位是像素/米,所以f_{x},f_{y}的单位是像素。

把上式写成矩阵的形式就是:

\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \frac{1}{Z} \begin{bmatrix} f_x& 0 & C_{x} \\ 0 & f_{y} & C_{y} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\\ Y \\ Z \end{bmatrix}

把Z挪到右边就是:

Z \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x& 0 & C_{x} \\ 0 & f_{y} & C_{y} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\\ Y \\ Z \end{bmatrix} \doteq KP

我们把上式中的矩阵K称为相机的内参数矩阵。通常情况下,相机的内参在出厂之后是固定的,不会在使用过程中发生变化。有的相机生产厂商会告诉你相机的内参,而有时需要你自己确定相机的内参,也就是所谓的标定。

既然有了内参,我们肯定也会想到是不是还有外参呢?答案是肯定的。

在上式中,我们使用的p的坐标是它在相机坐标系下的坐标。由于相机在运动,所以{\color{Red} p}的相机坐标应该是它的世界坐标根据相机的当前位姿变换到相机坐标系下的结果。

我们设p的世界坐标是P_{W},相机的位姿由它的旋转矩阵R和平移向量\vec{t}来描述,则有:

ZP_{u,v}=Z \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =K(RP_w+\vec{t}) =KTP_{w}(T是欧式变换矩阵,和用R、\vec{t}来描述的方法是等价的)

这个式子描述了p的世界坐标到它的像素坐标的投影关系。其中,相机的位姿{\color{Red} R,\vec{t}}或者{\color{Red} T}称为相机的外参数。相比于不变的内参数,外参会随着相机运动发生改变,同时它也是SLAM中待估计的目标,代表着机器人的轨迹。

在讨论一下归一化处理

假设世界坐标系下有一个固定的点P,世界坐标为P_w

相机在运动,假设相机的运动由R,\vec{t}或者变换矩阵T来描述,则P的相机坐标为\tilde{P_{c}}=RP_{w}+\vec{t}(注意它是一个三维向量)

显然,\tilde{P_c}还是有三个分量,设\tilde{P_c}=(X,Y,Z),我们可以将它化成齐次坐标:P_c=(X/Z,Y/Z,1)

这就相当于把P投影到了相机前方z=1的平面上,这个过程称为归一化处理z=1称为归一化平面P_c=(X/Z,Y/Z,1)称为归一化坐标

归一化处理可以用下图来表示它的过程:

P_c经过内参之后就得到了像素坐标,我们可以把像素坐标[u,v]^T看成对归一化平面上的点进行量化测量的结果。

畸变

为了获得好的成像效果,厂家往往会在相机的前方添加透镜。透镜的加入对成像过程中光线的传播会产生新的影响:(1)透镜自身的形状对光线传播的影响;(2)在机械组装过程中,透镜和成像平面不可能完全平行,这也会使得光线穿过透镜投影到成像平面时的位置发生变化。

1、径向畸变

由透镜形状引起的畸变称为径向畸变。

       在上面讲的针孔模型中,一条直线投影到像素平面上还是一条直线。但是,在实际拍摄的照片中,摄像机的透镜往往使得真实环境中的一条直线在图片中变成了曲线。越靠近图像的边缘,这种现象越明显。

       由于实际加工制作的透镜往往是中心对称的,这也使得不规则的畸变通常径向对称。它们主要分为两大类:桶形畸变和枕形畸变。如下图所示:

可以看到,成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。

对于径向畸变,无论是桶形畸变还是枕形畸变,畸变的效果都是随着与中心之间的距离增加而增加,畸变的数学模型可以用主点周围的泰勒级数展开式的前几项来进行描述。描述公式如下:

x_{distorted}=x(1+k_{1}r^2+k_{2}r^4+k_{3}r^6)

y_{distorted}=y(1+k_{1}r^2+k_{2}r^4+k_{3}r^6)

(x_{distorted},y_{distorted})是畸变纠正后点的坐标,(x,y)是归一化平面上点的坐标。

注:对于畸变较小的图像中心区域,畸变校正主要是k_1在起作用;而对于畸变较大的边缘区域,主要是k_2在起作用。通常来讲,普通摄像头使用前两项k_1,k_2就能很好的校正径向畸变。对于畸变很大的摄像头,比如鱼眼镜头,可以加入k_3项来进行校正。

2、切向畸变

       切向畸变是由于透镜本身与相机传感器平面(成像平面)不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。

径向畸变可以用两个额外的参数p_1,p_2来描述:

x_{distorted}=x+2p_{1}xy+p_2(r^{2}+2x^{2})

y_{distorted}=y+2p_{2}xy+p_{1}(r^{2}+2y^{2})

有了上面的知识之后,对于相机坐标系中的一点{\color{Red} P(X,Y,Z)},我们可以通过这五个畸变系数找到点{\color{Red} P}在像素平面上的正确位置:

1、将三维空间点投影到归一化图像平面。设它的归一化坐标为[x,y]^T

2、对归一化平面上的点进行径向畸变和切向畸变纠正。给定归一化坐标,可以求出原始图像上的坐标为:

      x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2)

      y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6)+2p_2xy+p_1(r^2+2y^2)

3、将纠正后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置为:

      u=f_xx_{distorted}+C_x

      v=f_yy_{distorted}+C_y

       径向畸变和切向畸变模型中一共有5个畸变参数,在OpenCV中它们被排列成一个5*1的矩阵,依次包含k_1,k_2,p_1,p_2,k_3,经常被定义为Mat矩阵的形式,如Mat distcoeffs=Mat(1, 5,  CV_32FC1, Scalar::all(0) );这五个参数就是相机标定过程中需要确定的的相机的5个畸变参数。求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值