《视觉SLAM14讲》学习小结——供小白快速入门ch5

相机模型

如前所述,视觉SLAM实质上可以归结为一个静态优化或参数估计问题。为了解决这个问题,首先需要建立优化模型,对本书所讨论的视觉SLAM而言主要是观测模型。本章的重点就是如何建立这个观测模型。作为入门内容,我们主要关注基于针孔相机的单目和双目模型。

一、针孔相机模型

1.常用坐标系

为了描述针孔相机的工作原理,需要先介绍一些常用的坐标系,如图1所示。相机坐标系Oxyz的原点O在相机光心,Oz轴为光轴方向指向前方,Ox轴与相机固联向下,Oy轴与相机固联向左。世界坐标系O^wx^wy^w与地面固联,其三轴根据需要指定。这两个都是三维的坐标系,除此之外还经常用到几个平面和对应的二维坐标系。物理成像平面是相机胶卷所在的平面,这个平面上的图像是倒像。为了方便使用,相机一般都会经过类似小孔成像的方法变成正像。因此我们想象有一个虚拟成像平面在相机的前方z_c=f的位置,以后将其简称为像平面。以虚拟成像平面中心为原点O^\prime,在平面内向下为O^\prime x^\prime轴,向右为O^\prime y^\prime轴可建立像平面坐标系O^\prime x^\prime y^\prime。将O^\prime x^\prime y^\prime系的原点平移到像平面的左上角即可得到像素坐标系ouv。和像平面坐标系不同的是,像素坐标系的坐标轴刻度单位是像素,而前者是长度单位米。将相机坐标系的Oxy平面平移到Z=1处即得归一化平面O^1x^1y^1z^1

图1:针孔相机模型

这样定义的坐标系与高博书上的定义方法略有不同,但更能保持论述内容的自洽性。例如像素坐标系与像平面坐标系的转换关系,像平面坐标与相机坐标的关系,OpenCV读取坐标时不需要调换(x,y)坐标位置等。

为了方面后面叙述和整个系列的一致性,我们对特征点符号和坐标的标记进行了如下统一规定。三维坐标系的点和坐标均用大写,相机坐标系中的点无上标如P(X,Y,Z),世界坐标系中的点加上标w如P^w(X^w,Y^w,Z^w);二维坐标系的点和坐标均用小写,像平面坐标系的点加上标"\prime"如\mathbf{p}^\prime(x^\prime,y^\prime),像素平面坐标系中的点无上标如\mathbf{p}(x,y),归一化平面坐标系中的点加上标1如\mathbf{p}^1(x^1,y^1)。下标用于区分不同的特征点,如\mathbf{p}_1,\mathbf{p}_2表示像素坐标系中的两个不同点。

2.坐标变换关系

设空间P点在相机坐标系中的坐标为\mathbf{P}=[X,Y,Z]^\mathrm{T},它在虚拟成像坐标系中的三维坐标为[x^\prime,y^\prime,f]^\mathrm{T}。则二者的关系为

x^\prime=f\frac{X}{Z},~y^\prime=f\frac{Y}{Z}                                                (1)

其中f为相机焦距。设像素坐标与像平面坐标的两坐标轴放大倍数分别为\alpha,\beta,则根据前面的坐标定义可知它与像素坐标的关系为

u=\alpha x^\prime+c_x,~v=\beta y^\prime+c_y                                             (2)

其中c_x, c_y分别是像平面坐标系原点的两个像素坐标。合并以上两式并写成矩阵形式可得

\mathbf{p}=\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} \doteq \frac{1}{Z}\mathbf{K}\mathbf{P}                                (3)

上式中已将像素坐标\mathbf{p}写成齐次坐标形式\mathbf{\hat{p}},但我们根据计算机视觉领域的约定,并没有区分\mathbf{p}\mathbf{\hat{p}}符号的差异。其中f_x=\alpha f, f_y=\beta fc_x, c_y一样单位都是像素。矩阵\mathbf{K}称为相机的内参数,一般是固定的。当我们对相机调焦时,则内参\mathbf{K}是会变化的。

根据图1或模仿式(1)还可建立归一化坐标与像平面坐标的关系x^1=\frac{X}{Z},~y^1=\frac{Y}{Z},利用这个结果可将式(3)改写为

\mathbf{p}=\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^1\\y^1\\1 \end{bmatrix} \doteq \mathbf{K}\mathbf{p}^1                                (4)

对比式(3)和(4)表明,相机的成像结果\mathbf{p}可以根据空间点三维坐标过程\mathbf{P}来建立,也可以根据归一化平面上的二维坐标\mathbf{p}^1来建立。这意味着,成像过程会丢失三维坐标信息。因此仅依靠单张相片是无法定位路标三维信息的。

根据坐标变换\mathbf{P}=\mathbf{R}\mathbf{P}^w+\mathbf{t},还可进一步得到世界坐标系中的坐标\mathbf{P}^w=[X^w,Y^w,Z^w]^\mathrm{T}与像素坐标的关系,即

\mathbf{p}= \frac{1}{Z}\mathbf{K}(\mathbf{R}\mathbf{P}^w+\mathbf{t})= \frac{1}{Z}\mathbf{K}\mathbf{T}\mathbf{P}^w                                (5)

其中\mathbf{R},\mathbf{t}表征相机的位姿,称为相机的外参数。相机的外参数会随相机运动而变化,也是SLAM优化中待估计的目标。

3.图像

当特征点在像平面上成像后,就会形成一个与特征点颜色或灰度对应的像素点。对于数码相机而言,这个像素点的特征信息可用一个一定字节的存储空间来表示。对于灰度图,一般只需要一个字节来表征,这时图像信息实质上是一个从像素坐标到灰度值的一一映射或函数,记为

I(u,v): \mathrm{R}^2\rightarrow \mathrm{R}                                                     (6)

对于一张宽度为640像素,高度为480像素的灰度图在OpenCV中的表示为

unsinged char image[480][640];                                                (7)

这跟我们前面对像素坐标系的定义是相恰的,即u坐标表示高度方向在前面,v坐标表示宽度方向在后面。如果要访问图像像素,则采用如下命令

unsinged char pixel = image[u][v];                                     (8)

按高博书上的定义,使用OpenCV时需要写成unsinged char pixel = image[v][u]; v坐标在u前面。这是因为其坐标系定义和我们不同的缘故。

如果是彩色相机,则每个像素包含红绿兰三种颜色,就需要用三个字节来分别表征这三个通道。在得到像素指针后,顺序取的三个字节就是RGB三种颜色的强度。如果继续读取下一个字节,那应该就是下一个像素的R值,以此类推。

如果图像还包括透明度(如png格式),则需要四个通道或四个字节来表征一个像素。其排序为RGBA,其中A表示深度。对于后面要介绍的RGB-D相机,每个像素中还包含深度(即距离)信息。这时需要用四个通道和更多的字节来表征一个像素,其排序一般为RGBD顺序。D一般以毫米为单位,若采用两个字节即可表征65.535米,一般情况下足以使用。

二、畸变模型及标定

1.畸变模型

相机的畸变因素很多,对于小孔成像相机,其主要畸变原因有两个。其一是由透镜形状引起的畸变(Distortion,也叫失真)。由于透镜加工过程中的轴对称性一般可以保证,所以这种失真一般只包含径向失真。如果相机图像的放大倍率随着径向距离增加而减小,则称为桶形失真;反之,相机图像的放大倍率随着径向距离增加而减小,则称为枕形失真;如图(2)所示

图2:径向畸变的两种类型

第二种畸变是由相机组装过程中不能使透镜和成像面严格平行引起的,称为切向畸变,如图3所示。

图3:切向畸变产生的原因和效果

由于畸变的缘故,相机所得到的归一化坐标与无畸变情况下的归一化坐标不同。对于径向畸变,令r=\sqrt{(x^1)^2+(y^1)^2},则畸变后的归一化坐标可用下式来表示

\left\{\begin{matrix} x_{d,r}=x^1(1+k_1r^2+k_2r^4+k^3r^6+\cdots)\\ y_{d,r}=y^1(1+k_1r^2+k_2r^4+k^3r^6+\cdots) \end{matrix}\right.                                (9)

切向畸变后的归一化坐标为

\left\{\begin{matrix} x_{d,t}=x^1+2p_1x^1y^1+p_2[r^2+2(x^1)^2]\\ y_{d,t}=y^1+2p_2x^1y^1+p_1[r^2+2(y^1)^2] \end{matrix}\right.                                (10)

2.相机标定

根据相机的成像模型和畸变模型,我们就可以很清晰地得到相机的成像过程。

(1)将世界坐标系中的特征点坐标\mathbf{P}^w通过外参变换得到相机坐标系中的坐标\mathbf{P}

(2)将相机坐标系中\mathbf{P}点的三维坐标投影到归一化坐标系中去得到\mathbf{P}^1[x^1,y^1,1]^\mathrm{T}

(3)根据[x^1,y^1,1]^\mathrm{T}按下式计算畸变后的归一化坐标\mathbf{p}^1_d(x^1_d,y^1_d,1)

\left\{\begin{matrix} x_d^1=x_{d,r}+2p_1x_1y_1+p_2(r^2+2x_1^2)\\ y_d^1=y_{d,r}+2p_2x_1y_1+p_1(r^2+2y_1^2) \end{matrix}\right.                                (11)

(4)将\mathbf{p}^1_d代替式(4)中的\mathbf{p}^1得到像素坐标\mathbf{p}

从上面成像过程中可以发现,要确定相机成像模型,需要确定f_x,f_y,k_1,k_2,k_3,p_1,p_2等7个参数,这种过程称为标定。由于外参一般是未知的,可以想象,参数标定是不容易的。幸运的是,目前已有成熟的标定方法,例如单目棋盘格的张正友标定法。

三、其他相机模型

如前所述,单目相机是无法获取深度或距离信息的。为了获取距离信息,一般可采用双目相机或深度相机RGB-D。下面分别予以介绍。

1、双目相机模型

双目相机主要是根据三角成原理确定目标深度或距离的,如图4所示。

图4:双目成像原理

根据三角形相似关系可建立如下关系式

\frac{Z-f}{Z}=\frac{b-v_L+v_R}{b}\Rightarrow ~Z=\frac{fb}{d}                                 (12)

其中b为基线长度,单位为米;d=v_L-v_R为视差,其最小值为1像素。双相机能观测的最远距离为fb,在焦距f固定的情况下与基座长度b有关。为了定位更远的距离,就需要更长的基线长度。

双目相机的原理看上去很简单,但实际应用中d的确定却很难。这是因为相机并不知道同一个点分别在左右眼中的像素位置。这个问题需要用计算机视觉的算法来解决,如常用库OpenCV就提供了很多这种算法。

2、RGB-D相机模型

RGB-D相机主要有两种,一种是通过结构光来测量像素距离;另外一种是根据飞行视觉(Time-of-Flight,TOF)原理测量像素距离,如图5所示。

图5:RGB-D相机原理示意图

以平行光为例,通过调节可使得平行光随飞行距离的增加间距线性变化。这样相机拍摄到平行光时即可根据平行光的间距确定目标距离。如果目标是三维的,则相机拍摄到的结果一般不是平行光。根据图像与目标形状的关系可确定目标的三维深度信息。TOF的原理和雷达类似。它向目标发射脉冲波并接收反射信号。根据两个脉冲波的相位差确定脉冲波的往返时间差,再与光速相乘即可获得目标的距离信息。通过数据处理可进一步转换成深度信息。

四、小结

本章讨论了相机的观测模型,需要注意到如下几点:

(1)我们所采用的坐标系与高博略有不同,主要是为了保证内容的自洽,也是为了方便理解和使用。

(2)我们对特征点符号和坐标的标记进行了统一的规定,增强了博文系列的可读性。

(3)掌握相机内参和外参的概念。

(4)了解相机标定的概念,有余力的读者可学习一下张正友的标定法。

(5)理解单目相机为什么不能确定深度信息。

(6)理解双目相机和RGB-D相机的工作原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值