前面我们已经说过了视觉SLAM的运动方程和观测方程。

android 底部半圆弧 效果 相机拍摄_世界坐标

在以相机为主的视觉SLAM中,观测主要是指相机成像的过程。

1、相机模型

android 底部半圆弧 效果 相机拍摄_计算机视觉_02

 常见的针孔相机模型如上图,在空间中有一点P,点P坐标为

android 底部半圆弧 效果 相机拍摄_世界坐标_03

,点P经过光心O投影之后落在了物理成像平面O'-x'-y'上,成像点为P',坐标为

android 底部半圆弧 效果 相机拍摄_计算机视觉_04

,设物理成像平面到小孔的距离为f(焦距)。根据相似三角形可以得出:

android 底部半圆弧 效果 相机拍摄_世界坐标_05

 公式中的负号表示所成的像是倒立的。由于相机输出的图像并不是倒像,而且为了便于操作,我们可以等价的将成像平面对称的放在相机前方,和三维空间点一同放在相机的同一侧。如下图所示:

android 底部半圆弧 效果 相机拍摄_归一化_06

 这样我们就可以将公式中的负号去掉:

android 底部半圆弧 效果 相机拍摄_世界坐标_07

 将X',Y'放在等式左侧得:

android 底部半圆弧 效果 相机拍摄_人工智能_08

 上式描述了点P和它的像之间的空间关系,X',Y'为所成像的坐标,X,Y,Z为空间坐标。但在相机中,我们最终获得的是像素,我们需要在物理成像平面上固定一个像素平面o-u-v,于是,我们可以在像素平面上得到点P'的像素坐标

android 底部半圆弧 效果 相机拍摄_世界坐标_09

。像素坐标系的定义为:原点o'位于图像的左上角,u轴向右与x轴平行,v轴向下与y轴平行。像素坐标系与成像平面之间,相差了一个缩放和原点的平移,设像素坐标在u轴上缩放了α倍,v轴上缩放了β倍。同时原点平移了

android 底部半圆弧 效果 相机拍摄_世界坐标_10

所以P'的坐标和像素坐标

android 底部半圆弧 效果 相机拍摄_世界坐标_09

的关系为:

android 底部半圆弧 效果 相机拍摄_图像处理_12

 将上面的X',Y'公式代入并简化(fx=αf,fy=βf)可得:

android 底部半圆弧 效果 相机拍摄_人工智能_13

 上式中fx,fy,cx,cy我们称为相机的内参,相机的内参是相机出厂就固定的。

我们将上面的公式写为矩阵的形式,并进行适当的齐次化:

android 底部半圆弧 效果 相机拍摄_人工智能_14

 简单变形:

android 底部半圆弧 效果 相机拍摄_归一化_15

 从上面的式子中我们可以知道,只要有了矩阵K,就可以计算出在真实世界(P)在相机内投影后的坐标了(u,v)。

有了内参,也有外参,外参就是我们之前说的位姿变化,即旋转和平移,我们便可以表示如何从世界坐标下的一点通过位姿变化转到相机坐标然后再转到像素坐标。

android 底部半圆弧 效果 相机拍摄_归一化_16

 投影还可以从另一个角度来看,可以先将世界坐标点转换到相机坐标系,再除掉最后一维的数值(即深度),这相当于做了归一化处理,得到点P在相机归一化平面上的投影。

android 底部半圆弧 效果 相机拍摄_归一化_17

 

我们可以将投影顺序归纳为:

世界——相机——归一化——像素。

再回顾我们之前的观测方程:

android 底部半圆弧 效果 相机拍摄_世界坐标

 Zk,j就是最终的像素坐标,yi就是点P(x,y,z),Xk代表着位姿变换。

2、畸变模型

为了更好的获得成像效果,我们会在相机中加入透镜,由透镜形状引起的畸变称为径向畸变。径向畸变又分为桶形畸变和枕形畸变。

由于相机在组装中的误差引起的畸变叫做切向畸变。

我们考虑归一化平面上的一点P,坐标为

android 底部半圆弧 效果 相机拍摄_人工智能_19

极坐标为

android 底部半圆弧 效果 相机拍摄_计算机视觉_20

r代表点p与坐标系原点间的距离,θ表示与水平轴的夹角。径向畸变可以看作坐标点沿着长度方向发生了变化,也就是距离原点的长度发生了变化,切向畸变可以看作是坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化。

对于径向畸变,我们可以用多项式来表示:

android 底部半圆弧 效果 相机拍摄_人工智能_21

 

android 底部半圆弧 效果 相机拍摄_计算机视觉_22

是未进行纠正的点,而

android 底部半圆弧 效果 相机拍摄_计算机视觉_23

是纠正过后点的坐标,他们都是归一化平面的点,而不是像素平面的点。

对于切向畸变可以这样表示:

android 底部半圆弧 效果 相机拍摄_归一化_24

 结合上面所说,我们对于相机坐标系中的点P,我们可以通过5个畸变系数来找到这个点对应像素坐标系下正确的位置:

1、将三维空间点投影到归一化平面上,将他的归一化坐标记为

android 底部半圆弧 效果 相机拍摄_计算机视觉_25

2、对归一化坐标进行去畸变处理:

android 底部半圆弧 效果 相机拍摄_世界坐标_26

 3、最后将处理完毕后的归一化坐标投影到像素平面,从而得到正确位置:

android 底部半圆弧 效果 相机拍摄_人工智能_27

 3、单目相机成像过程总结

1、首先世界坐标系下有一固定点P,他的世界坐标为Pw。

2、通过位姿变换将点P的世界坐标转换到相机坐标系下:

android 底部半圆弧 效果 相机拍摄_图像处理_28

3、将相机坐标系坐标进行归一化处理,得到点P的归一化坐标

android 底部半圆弧 效果 相机拍摄_图像处理_29

 

4、如果有畸变,将Pc进行去畸变处理,得到去畸变之后的归一化坐标。

5、最终将归一化坐标经过内参后得到像素坐标

android 底部半圆弧 效果 相机拍摄_计算机视觉_30

 

 

 4、双目相机模型

单目相机由于归一化的原因,并没有能够很好的获得深度信息。在SLAM中只有很好的知道深度信息,才能准确的估计位置。

      

android 底部半圆弧 效果 相机拍摄_世界坐标_31

 如上图为双目相机的成像原理,Ol和Or为光心的位置,Pl和Pr为左右相机成像的位置,f为焦距,b为基线,表示双目相机中左眼相机与右眼相机的距离,根据上图的几何模型,我们可以根据相似三角形得出以下公式:

android 底部半圆弧 效果 相机拍摄_计算机视觉_32

 整理之后得:

android 底部半圆弧 效果 相机拍摄_归一化_33

 d我们称为视差,表示成像坐标之间的差值。可以看出视差和距离成反比,视差越大,距离越近,视差越小,距离越远。视差最小为一个像素,所以理论上距离有一个极限值,这个极限值由fb确定,基线越大,可以测的距离越远,反之亦然。

5、RGB-D相机

相比双目相机采用视差来测量距离,深度相机则是主动测量深度,目前深度相机按照原理可以分为:

1、红外结构光原理测量距离

2、通过飞行时间测量距离