5.1 相机模型
相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述。这个模型有很多种,其中最简单的称为针孔模型。
针孔模型描述了一束光线通过针孔之后,在针孔背面投影成像的关系。
由于相机镜头上的透镜的存在,会使得光线投影到成像平面的过程中会产生畸变。因此,我们
使用针孔和畸变两个模型来描述整个投影过程。
1 针孔相机模型
蜡烛投影实验:在一个暗箱的前方放着一支点燃的蜡烛,蜡烛的光透过暗箱上的一个小孔投影在暗箱的后方平面上,并在这个平面上形成了一个倒立的蜡烛图像。
小孔模型能够把三维世界中的蜡烛投影到一个二维成像平面。同理,这个简单的模型可以解释相机的成像过程。
设 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(焦距)。根据三角形相似关系,有:
负号表示成的像是倒立的。
把成像平面对称到相机前方,和三维空间点一起放在摄像机坐标系的同一侧,可以把负号去掉,
整理得:
上式描述了点 P 和它的像之间的空间关系。不过,相机获得的是一个个的像素,这需要在成像平面上对像进行采样和量化。为了描述传感器将光线转换成图像像素的过程,设在物理成像平面上固定一个像素平面o-u-v。像素平面 P ′ 的像素坐标:[u, v]T 。
像素坐标系定义方式:原点 o′ 位于图像的左上角,u 轴向右与 x 轴平行,v轴向下与 y 轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。设像素坐标在u轴上缩放了α倍,在 v上缩放了β倍。原点平移了[cx, cy ]T 。那么,P ′ 的坐标与像素坐标 [u, v]T 的关系为:
代入并把αf 合并成 fx,把βf 合并成 fy ,得:
其中,f 的单位为米,α, β 的单位为像素每米,所以 fx, fy 的单位为像素。写成矩阵形式,左侧需要用到齐次坐标:
中间的量组成的矩阵称为相机的内参数矩阵(Camera Intrinsics)K。通常相机的内参在出厂之后是固定的,不会在使用过程中发生变化。有时需要自己确定相机的内参,也就是所谓的标定。
除了内参之外,自然还有相对的外参。上式中P是在相机坐标系下的坐标。由于相机在运动,所以 P 的相机坐标应该是它的世界坐标(Pw)根据相机的当前位姿变换到相机坐标系下的结果。相机的位姿由它的旋转矩阵 R 和平移向量 t 来描述。那么有:
后一个式子隐含了齐次坐标到非齐次坐标的转换。描述了 P 的世界坐标到像素坐标的投影关系。其中,相机的位姿 R, t 称为相机的外参数(Camera Extrinsics)。外参会随着相机运动发生改变,同时也是 SLAM中待估计的目标,代表机器人的轨迹。
上式两侧都是齐次坐标。因为齐次坐标乘上非零常数后表达同样的含义,所以可以把 Z 去掉:
此时等号意义变成在齐次坐标下相等的概念,相差了一个非零常数。
对齐次到非齐次的变换,右侧的 T Pw 表示把一个世界坐标系下的齐次坐标变换到相机坐标系下。为了使它与 K 相乘,需要取它的前三维组成向量——因为 T Pw 最后一维为 1。此时,对这个三维向量,按照齐次坐标的方式,把最后一维进行归一化处理,得到 P 在相机归一化平面上的投影:
这时Pc 可以看成一个二维的齐次坐标,称为归一化坐标。它位于相机前方 z = 1 处的平面上。该平面称为归一化平面。由于 Pc 经过内参之后就得到了像素坐标,所以我们可以把像素坐标Puv= [u, v]T 看成对归一化平面上的点进行量化测量的结果。
2 畸变
为了获得好的成像效果,相机的前方加了透镜。透镜的加入对成像过程中光线的传播会产生新的影响: 一是透镜自身的形状对光线传播的影响,二是在机械组装过程中,透镜和成像平面不可能完全平行,这也会使得光线穿过透镜投影到成像面时的位置发生变化。
由透镜形状引起的畸变称之为径向畸变。针孔模型中,一条直线投影到像素平面上还是一条直线。
实际拍摄的照片中,摄像机的透镜往往使得真实环境中的一条直线在图片中变成了曲线。越靠近图像的边缘,这种现象越明显。
透镜往往是中心对称的,这使得不规则的畸变通常径向对称。主要分两类,桶形畸变和枕形畸变
桶形畸变是由于图像放大率随着离光轴的距离增加而减小,而枕形畸变却恰好相反。在这两种畸变中,穿过图像中心和光轴有交点的直线还能保持形状不变。
除了透镜的形状会引入径向畸变外,在相机的组装过程中由于透镜和成像面不能严格平行也会引入切向畸变。
平面上的任意一点 p笛卡尔坐标表示为 [x,y]T , 极坐标的形式[r,θ]T ,其中 r 表示点 p 离坐标系原点的距离, θ表示和水平轴的夹角。径向畸变可看成坐标点沿着长度方向发生了变化 δr, 也就是其距离原点的长度发生了变化。切向畸变可以看成坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化δθ 。
对于径向畸变,无论是桶形畸变还是枕形畸变,都是随着离中心的距离增加而增加。可以用一个多项式函数来描述畸变前后的坐标变化:这类畸变可以用和距中心距离有关的二次及高次多项式函数进行纠正:
其中 [x,y]T 是未纠正的点的坐标,[xcorrected,ycorrected]T 是纠正后的点的坐标,它们都是归一化平面上的点,而不是像素平面上的点。
上面的纠正模型中,对于畸变较小的图像中心区域,畸变纠正主要是 k1起作用。而对于畸变较大的边缘区域主要是 k2 起作用。普通摄像头用这两个系数就能很好的纠正径向畸变。畸变很大的摄像头,比如鱼眼镜头,可以加入 k3 畸变项对畸变纠正。
对于切向畸变,可以使用另外的两个参数 p1,p2 来进行纠正:
联合上面两方程组,对于相机坐标系中的一点 P (X,Y,Z),能够通过五个畸变系数找到这个点在像素平面上的正确位置:
1) 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [x,y]T 。
2) 对归一化平面上的点进行径向畸变和切向畸变纠正。
3) 将纠正后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置。
上面使用了五个畸变项。实际应用中,可以灵活选择纠正模型,比如只选择 k1; p1; p2 这三项等。
当一个图像去畸变之后,就可以直接用针孔模型建立投影关系,而不用考虑畸变。因此,在后文
的讨论中,可以直接假设图像已经进行了去畸变处理。
单目相机的成像过程小结:
1)世界坐标系下有一个固定的点 P ,世界坐标为 Pw;
2)由于相机在运动,它的运动由外参 R,t 或变换矩阵 T属于SE(3) 描述。P 的相机坐标为:
3)这时的 ~Pc 仍有 X,Y,Z 三个量,把它们投影到归一化平面 Z = 1 上,得到 P 的归一化相机坐标:Pc = [X/Z,Y/Z,1]T 。
4)最后,P 的归一化坐标经过内参K后,对应到它的像素坐标:Puv = KPc。
3 双目相机模型
针孔相机模型描述了单个相机的成像模型。然而,仅根据一个像素是无法确定这个空间点的具体位置的。这是因为,从相机光心到归一化平面连线上的所有点,都可以投影至该像素上。只有当 P 的深度确定时(比如通过双目或 RGB-D 相机),才能确切地知道它的空间位置。
测量像素距离(或深度)的方式有很多种,像人眼根据左右眼看到的景物差异(视差)来判断物体的距离。双目相机的原理亦是如此。通过同步采集左右相机的图像,计算图像间视差来估计每一个像素的深度。
双目相机一般由左眼和右眼两个水平放置的相机组成。两个相机都看作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于 x 轴上。它们的距离称为双目相机的基线(Baseline, 记作 b),是双目的重要参数。
对一个空间点 P ,它在左眼和右眼各成一像,记作 PL,PR。由于相机基线的存在,这两个成像位置是不同的。理想情况下,由于左右相机只有在 x 轴上有位移,因此P 的像也只在 x 轴(对应图像的 u 轴)上有差异。记它在左侧的坐标为 uL,右侧坐标为 uR。根据三角形相似关系,有:
整理,得:
d 为左右图的横坐标之差,称为视差(Disparity)。根据视差可以估计一个像素离相机的距离。视差与距离成反比:视差越大,距离越近。同时,由于视差最小为一个像素,于是双目的深度存在一个理论上的最大值,由 f b 确定。当基线越长时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。
视差 d 本身的计算比较困难,需要确切地知道左眼图像某个像素出现在右眼图像的哪一个位置(即对应关系),而且只有在图像纹理变化丰富的地方才能计算视差。由于计算量的原因,双目深度估计仍需要使用 GPU 或 FPGA 来计算。
4 RGB-D 相机模型
相比于双目相机通过视差计算深度,RGB-D 相机更为“主动”,能够主动测量每个像素的深度。RGB-D 相机按原理可分为两大类:
1) 通过红外结构光(Structured Light)来测量像素距离。
向目标发射红外结构光根据返回的结构光图案,计算物体离自身的距离。
2) 通过飞行时间法(Time-of-flight, ToF)原理测量像素距离
向目标发射脉冲光,根据发送到返回之间的光束飞行时间,确定物体离自身的距离。
结构光、ToF的RGB-D 相机都需要向探测目标发射一束光线(通常是红外光)。ToF 原理和激光传感器十分相似,不过激光是通过逐点扫描获取距离,而 ToF相机则可以获得整个图像的像素深度。
测量深度之后,RGB-D 相机通常按照生产时的各个相机摆放位置,完成深度与彩色图像素之间的配对,输出一一对应的彩色图和深度图。在同一个图像位置就可以读取到色彩信息和距离信息,计算像素的 3D 相机坐标,生成点云(Point Cloud)。RGB-D 数据既可以在图像层面进行处理,亦可在点云层面处理。
RGB-D 相机能实时地测量每个像素点的距离。
缺点:使用范围受限。红外线容易受到日光或其他传感器发射的红外光干扰,因此不能在室外使用,同时使用多个也会相互干扰。对透射材质的物体,因为接受不到反射光,无法测量这些点的位置。成本、功耗方面也有一些劣势。
5.2 图像
1 计算机中图像的表示
灰度图中每个像素位置 (x,y) 对应到一个灰度值 I,一张宽度为 w,高度为 h 的图像,数学形式为
用 0-255 之间整数(即一个 unsigned char,一个字节)来表达图像的灰度大小。
图像自然是由像素组成的。访问某一个像素时,需要指明它所处的坐标。
图 5-8 左边显示了传统像素坐标系的定义方式。一个像素坐标系原点位于图像的左上角,X 轴向右,Y 轴向下(也就是前面所说的 u,v 坐标)。第三个轴Z 轴应该是向前的。与相机坐标系一致。平时说的图像的宽度和列数,对应着 X 轴;而图像的行数或高度,则对应 Y 轴。
一个位于 x,y 处的像素在程序中的访问方式应该是:
对应着灰度值 I(x,y) 的读数。需要注意这里的 x 和 y 的顺序。
一个灰度像素可以用八位整数记录,也就是一个 0-255 之间的值。要记录的信息更多时,一个字节就不够了。在 RGB-D 相机的深度图中,记录了各个像素离相机的距离,通常是毫米为单位,而 RGB-D 相机的量程通常在十几米范围左右,超过了 255 的最大值范围。这时会采用十六位整数来记录深度图的信息,也就是 0 至 65536 之间的值。
彩色图像的表示则需要通道(channel)的概念。在计算机中,红色,绿色和蓝色这三种颜色的组合来表达任意一种色彩。对每一个像素,就要记录它的 R,G,B 三个数值,每一个数称为一个通道。常见的彩色图像有三个通道,每个通道都由 8 位整数表示。这样一个像素占据 24 位空间。
通道的数量,顺序是自由定义的。在 OpenCV 的彩色图像中通道的默认顺序是 B,G,R。如果还想表达图像的透明度时,就使用 R,G,B,A 四个通道来表示。
5.3 实践:图像的存取与访问
1 安装 OpenCV
2 操作 OpenCV 图像
图像读取、显示、像素遍历、拷贝、赋值等。