酸菜鱼的SLAM之旅(2)

2019年3月24日:相机与图像

相机模型

keyword:针孔模型、畸变、内参数


插一点小知识:

  • Markdown语法上下标:

    H2O & aT

    H<sub>2</sub>O  //下标
    a<sup>T</sup>   //上标
    
  • MarkDown输入数学公式

  • 让MarkdownPad显示数学公式

在MarkdownPad中,点击”Tools > Options > Advanced > HTML Head Editor”,这个是自定义头文件。添加下列内容:

<script type="text/javascript" src='http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML'></script>

此时需要【F6】进入浏览器模式才能够显示

离线的话就先把MathJax clone到本地,然后使用绝对路径引用,应该就可以了

绝对路径加到头文件中,demo如下:

<script type="text/javascript" src="file:\\\D:\software\MathJax\MathJax.js?config=TeX-MML-AM_CHTML-full"></script>

针孔相机模型

AdUu8O.jpg

相机坐标系为O-x-y-z,习惯上z轴指向相机前方,x向右,y向下。(也就是这幅图相当于成像平面为相机的显示屏,光心O为相机的镜头。)

P为现实中的空间点,坐标为【X,Y,Z】T,(在相机坐标系中)

而P’为它在成像平面的坐标,【X’,Y’,Z’】T(在成像平面中,即图上的O-x’-y’-z’)

图上f为焦距,Z为P点在现实中的Z轴的位置

根据三角形相似关系得到两个坐标之间的关系(负号表示成像倒立)

$$\frac{Z}{f} = - \frac{X}{X’} = -\frac{Y}{Y’}$$

简化模型可以把成像平面对称到相机前方,也就是

AdUe56.jpg

此时式子变为

$$\frac{Z}{f} = \frac{X}{X’} = -\frac{Y}{Y’}$$

设在物理成像平面上固定着一个像素平面: o-u-v,像素平面上可以得到P’的像素坐标:[u,v]T

像素坐标系通常的定义方式是:原点o′位于图像的左上角,u轴向右与x轴平行,v轴向下与y轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移

AdUZUx.png

(5.6)中的P - 相机坐标 - 相机的世界坐标(Pw) - 可以得到相机的位姿(由旋转矩阵R 和 平移向量 t来描述)

因此 外参 为相机的位姿 Rt

AdUAbR.jpg
归一化处理:

归一化平面:

归一化坐标:


畸变

获得更好的成像效果 - 相机前方加透镜 - 对成像过程光线传播造成影响:

  1. 透镜自身的形状对光线传播的影响
  2. 是在机械组装过程中,透镜和成像平面不可能完全平行,这也会使得光线穿过透镜投影到成像面时的位置发生变化。
  • 径向畸变:由透镜形状引起的畸变
    • 桶形畸变:由于图像放大率随着离光轴的距离增加而减小
    • 枕型畸变:由于图像放大率随着离光轴的距离增加而增加

AdUVV1.jpg

径向畸变的纠正模型:用多项式函数来描述前后的坐标变化

AdUnPK.jpg

  • 切向畸变:由于透镜和成像面没有严格平行

AdUK2D.png

AdUMxe.jpg

可以合并进行同时纠正(也就是把两个纠正式相加),最理论的情况下用到了5个畸变项(径向3 + 切向 2),实际情况下可以灵活选择其中几项。所有的纠正都在归一化平面上完成。

AdU1rd.jpg
AdUlKH.jpg

!仅通过一个像素无法确定空间点的具体位置,因为从相机光心到归一化平面连线上的所有点都可以投影到该像素上。只有P的深度确定时才能够知道确切的空间位置。

  • 能否知道确切的空间位置
    • 针孔相机模型 (X)
    • 双目相机模型 (√)
    • RGB-D相机模型 (√)

双目相机模型

原理:根据左右眼看到的景物差异(视差)来判断物体与我们的距离

AdUGVI.png

  • 基线:两个相机的光圈中心的距离(Baseline,用符号b表示)
  • 视差:左右图横坐标之差(UL - UR)
  • 视差越大,距离越近
  • 双目深度理论上的最大值(当视差为1个像素) - fb
  • 基线越长,双目最大能测到的距离越远
  • 反光可能会扰乱测距

RGB-D相机模型

原理*2:向探测目标发射红外光,根据返回的图案/飞行时间计算距离

  1. 结构光原理:通过红外结构光返回的图案来测量像素距离
  2. 飞行时间法(Time-of-flight,ToF)原理:向目标发送脉冲光,根据发送到返回之间的光束飞行时间测量像素距离
    AdUYIP.jpg

问题:

  1. 使用范围有限制,会收到日光或者其他传感器发射的红外光干扰,因此不能在室外使用
  2. 同时使用多个RGB-D相机会互相干扰
  3. 投射材质的物体无法接受反射光,因此无法测量这些点的位置(玻璃)

图像

###灰度图

每个像素位置(x,y)对应一个灰度值I,因此一张宽为w高为h的图像可以看成一个w*h的矩阵。常见的灰度图中,我们用0-255之间的整数(即一个 unsigned char,一个字节)来表达图像的灰度大小。即我们可以用一个二维数组来表示。

在图像中,数组的行数(二维数组的第一个下标)表示图像的高度,而列数(第二个下标)表示图像的宽度。

AdUJat.jpg

!!!以上图为例,这里要注意,图像的宽度/列数,对应的X轴;图像的行数/高度,对应Y轴。也就是说,取坐标应该是:

unsigned char pixel = image[y][x] //位于(x,y)处的像素,对应I(x,y)的读数
  • 灰度像素用八位整数记录(0-255) unsigned char
  • RGB-D相机深度图记录距离,用十六位整数 unsigned short
  • 彩色图像引入通道(channel)的概念,记录R,G,B三个数值,每一个数值称为一个通道。每个通道使用9位整数表示,也就是一个像素占据24位空间。
  • 在OpenCV的彩色图像中,通道的默认顺序是B,G,R。前8位代表蓝色,中间8位代表绿色,后8位代表红色。
  • 如果还需要表达图像的透明度,可以使用R,G,B,A四个通道表示

OpenCV使用实践(占坑)

文章目录
  1. 1. 2019年3月24日:相机与图像
  2. 2. 相机模型
    1. 2.1. 针孔相机模型
    2. 2.2. 畸变
    3. 2.3. 双目相机模型
    4. 2.4. RGB-D相机模型
  3. 3. 图像
  4. 4. OpenCV使用实践(占坑)