本文主要参考了两部计算机图形学经典教材,已在我的个人网站上提供资源链接: ,各位客官点赞后自取「第一次恬着脸要赞」: 3D计算机图形学(第三版)中文版 ; 计算机视觉中的多视图几何中、英文版 。最近在研究三维重建的代码时涉及到相机姿态和内外参数的概念,不是很明白,所以学习和记录一下。
摄像机模型的物理学原理
摄像机 可以定义为3D世界到2D图像之间的一种映射。我们生活中使用的手机摄像头和单反相机究其根本都是 小孔成像 的原理。本文要讨论的模型也为最简单的 针孔相机模型 。想象一下,在一个黑盒子的一面用针戳一个小孔,在它对面内部铺设一层感光材料,那么物理世界的物体发出或反射出的光线穿过小孔就会在感光板上呈现出一个 清晰的、倒置的、较暗的 图像。
为什么是清晰的呢? 因为理想的针孔只能通过一束光线,即物理世界的物体上的每一个点只与图像上的每一个点唯一对应。
如果小孔太大,物体上的每个点发出的光线和小孔的边缘连线就组成了一个光锥,光锥照射在感光板上就会是一个光斑,那么图像就像是散光的人夜晚看路灯一样模糊。
如果小孔太小,由于衍射效应,虽然物体上的点只有一束光线通过小孔,但穿过小孔后却会扩散成泊松亮斑。
为什么是倒置的呢? 这个画画图就可以看出来:
为什么是较暗的呢? 根据以上对清晰图像的讨论,考虑可见光的波长以及人眼的最小分辨角,理论计算得到小孔的最佳直径为0.25mm左右,相当于F/200的光圈值。大多数光线都被盒子挡住了,小孔能够进入的光量有限,所以图像较暗。为了平衡图像亮度,实际拍摄的时候就需要延长曝光时间,我们有摄影学曝光补偿的计算公式:
其中 代表光圈系数值, 代表快门(曝光)时间,ISO代表感光度。在图像传感器的感光度为100时,使用F/1光圈曝光1秒所需的曝光补偿定义为0。从公式中可以看出光圈系数增大2倍(光圈孔径缩小为一半),曝光时间需要延长4倍才能保持曝光量恒定。我的手机小米10Pro的近、远距摄像头都是F/2光圈,快门时间1/30秒的时候看起来与肉眼接近,可以想象F/200的光圈达到这个亮度至少需要曝光55分钟,即要求55分钟内景物不发生变化。文末我补充了光圈系数、感光度、曝光补偿的概念介绍。
为了解决图像较暗的问题,我们应当扩大针孔以增加进光量,为了解决扩大针孔导致的图像模糊问题,我们 在小孔处放置一个凸透镜 ,因为众所周知,凸透镜具有聚集光线的作用。但这也造成了新的问题:凸透镜无法将远近不同的点汇聚在同一平面上。于是我们引入 景深 和 对焦 的概念。
景物发出的光线通过凸透镜汇聚在焦平面上,而景物的近点和远点对应着不同的焦平面。如上图所示,光线相交的地方可以认为景物是完全清晰的,类似小孔成像的原理,景物的点和焦平面上的点唯一对应。此时的景物的近点和远点真正清晰的位置分别在当前焦平面的前后,那么在当前焦平面上就呈现为光斑。由于人眼的分辨能力有限,在光斑的弥散圆直径小于一定阈值时,人眼都会认为是清晰的,所以此时近、远点之间的景物都可以看清,它们之间的距离就被称作 景深 ,而对应的焦平面之间的距离就被称作焦深。摄像机对焦的过程就是将感光板前后移动,直到它落在焦点平面附近的焦深范围内,这样就可以控制特定景物平面看起来更清晰。手机摄像头的自动对焦是通过控制音圈马达实现的,参考 景深主要和焦距、光圈以及拍摄距离有关:拍摄距离越远、光圈越小、焦距越短,景深越大,参考 。
摄像机模型的数学描述
我们大概知道了摄像机成像的原理,但还需要对其进行定量的数学描述。前面已经提到摄像机是从3D世界到2D图像的一种映射,我们也可以称之为投影。这里我们考虑中心投影,即只考虑景物发出的通过凸透镜中心(光心)的那些光线,如下图中红色实线所示。我们将图像从 位置移动到 处进行分析,那么物 、像 与光心 就组成了中心投影关系,其中 为投影中心。
我们假设有一个世界坐标系,即一个全局的、共识的坐标系,所有物理实体都对应这个坐标系下的一个坐标。假设 摄像机中心 (又称光心)在坐标原点处,摄像机的焦平面 称为 图像平面 ,摄像机中心到图像平面的垂线称为 主轴 或主摄线,即下图中的 轴,主轴与图像平面交点称为 主点 ,即下图的 点(世界坐标系下为 )。另外注意我们这里使用的都是 右手坐标系 ,右手系是标准的数学规范。
假设景物中有一点 被映射到图像平面上的 ,根据相似三角形我们可以算出这个投影过程:
为了计算方便,我们还可以使用 齐次坐标 来表示中心投影。齐次坐标就是将一个原本是 维的向量用一个 维向量来表示,例如对于二维坐标 ,对应的齐次坐标为 ,其中 可以为任何非0实数,例如取1。更多介绍参考 。引入额外的维度是为了将当前空间下的平移操作从加法变成矩阵乘法,以统一形式。那么以上投影过程可以表示为矩阵形式:
这里世界坐标系中的点 表示为齐次矢量 ,图像坐标系中的点 表示为齐次矢量 ,上面的矩阵被称为齐次摄像机投影矩阵 ,那么上式可以简写为:
其中投影矩阵可以记作如下
其中 是对角矩阵,而 表示矩阵分块成一个3x3的单位矩阵拼接上一个全零列向量。由于上式我们假设图像平面的坐标原点在主点上,实际图像原点可能在图像一角,比如说左下角,这时需要修正上述公式,加入二维坐标系的平移。
其中 是主点在图像坐标系下的坐标。同样我们可以用齐次坐标表示上述方程。
若记
则投影方程可表示为
矩阵 称为 摄像机标定矩阵 。由于我们之前假设摄像机中心在世界坐标系原点处,即摄像机坐标系和世界坐标系重合,但实际上它们未必重合。两个坐标系可以通过旋转和平移互相变换。将上面讨论的点 在世界坐标系下重新记为 ,在摄像机坐标系下记为 ,假设 为摄像机中心在世界坐标系中的坐标。则有
其中 是一个3x3的旋转矩阵。这个方程可以变形为:
记齐次坐标
再根据上面齐次摄像机投影方程的结论,我们最终得到一般情况下,世界坐标系中的齐次坐标点 到图像坐标系中的齐次坐标点 的变换方程:
有时候习惯记 ,那么摄像机投影矩阵就可以定义为
这个矩阵共有9个自由度,其中3个来自 ,3个来自 ,3个来自 。包含在 中的参数称为摄像机的 内部参数 ,因为它们是由摄像机内部结构决定的,不随环境改变,比如焦距。包含在 和 中的参数成为 外部参数 ,与摄像机的姿态(世界坐标系中的位置和朝向)有关。
手机摄像头通常采用CMOS传感器作为图像传感器(除了个别手机,参考 ),而数码摄像机通常采用CCD传感器,参考 。由于CCD传感器的像素可能不是正方形,如果图像坐标以像素为单位来测量,就需要在每个方向上乘上一个尺度系数 ,那么
另外有些摄像机可能还存在图像扭曲,坐标轴可能不是严格垂直的,引入扭曲参数 ,最终得到修正后的标定矩阵 :
摄像机模型的数学描述就介绍完了。对于以上模型参数的确定过程被称作 摄像机标定 ,这是计算机视觉领域一个久远且重要的问题。目前我涉及到的是使用同一相机拍摄的多幅图像直接进行标定的方法,也称作 自标定 ,因为它不需要借助标定板。
补充知识
光圈系数
令入射孔直径为 ,镜头焦距为 ,我们分别定义相对孔径 和光圈系数 如下:
相对孔径和光圈系数是很容易混淆的,正如 中所说,网上很多资料都写反了。它们互为倒数,很显然相对孔径应该是孔径做分子。关于焦距和光圈系数的表示方法也非常混乱。因为小米的专业相机模式下使用大写 表示焦距,本文沿用这种写法,并规定使用小写 表示光圈系数的值。光圈系数记作 /# 的形式,其中#是 的具体值。这种形式只是为了提醒我们光圈的大小 是和系数成反比的,实际上 。光圈越小、光圈系数越大、 /# 中#的值越大,图像越暗。
另外光圈常说大一档、小一档,根据曝光补偿公式,光圈系数和图像亮度是平方反比的关系,又由于前面有个 所以,大一档指的是 ,实际上光圈是变小的,这块的定义太反人类了。参考 。
感光度
感光度,又称为ISO值,是衡量底片或图像传感器对于光的灵敏程度。ISO这个名字其实就是制定感光度标准的国际标准化组织( I nternational O rganization for S tandardization)。这个组织制定了各个方面的国际标准,包括参与制定C89的C语言标准: ANSI/ISO 9899-1989 ,所以有时候会看到有些地方把C语言称作ISO C,就特指它制定的原版标准的语法。言归正传,提高感光度可以提升图像亮度,但也会导致图像质量下降。我们一般通过使用大光圈或者外部设备补光来提升画面亮度。
曝光补偿
上文中已经给出曝光补偿的计算公式。本文这里的 特指摄影学里定义的曝光补偿而不是物理学的曝光值/曝光量。前者可以认为是,为了让画面达到正常亮度我们需要额外增加的曝光量,所以和后者的概念是反的。光圈系数越大(光圈越小)、快门时间越短、感光度越低,需要的曝光补偿就越大。
图形变换矩阵
平移、缩放、错切变换:
这里的 表示各轴缩放比例, 表示沿各轴平移距离, 表示两轴间错切的距离。错切代表的是两轴之间不再是垂直关系,即一个正方形在错切后变成一般的平行四边形。
旋转变换(这里是绕 轴逆时针旋转 角度):
可以与本文中的标定矩阵、旋转矩阵对应,慢慢体会其中的规律。这篇文章对于图形学中的基本变换讲解的很详细了: 。
标签:摄像机,参数,模型