相机模型与视觉测距:
一、相机数学模型
- 从世界坐标系到相机坐标系

假设在某间房子中放了一台相机拍照。为了方便测量,我们以房子的某处墙角为原心建立直角坐标系,即世界坐标系。为了研究相机模型,要做的第一步就是将世界坐标系转化为以相机光心为原点的相机坐标系,以相机的视角来“看”外部世界。
从世界坐标系
到以相机光心为坐标原点的
的相机坐标系,实际上就是一个三维直角坐标系的旋转与平移变换,可以表示为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF9jKyU1QyU1QysrKyt5X2MrJTVDJTVDKysrK3pfYyU1QyU1QysrKyU1Q2VuZCU3QnBtYXRyaXglN0QrJTNEUl8lN0IzJTVDdGltZXMzJTdEKyslNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF93KyU1QyU1QysrKyt5X3clNUMlNUMrKysrel93KyU1QyU1QysrKyU1Q2VuZCU3QnBtYXRyaXglN0QrJTJCVF8lN0IzJTVDdGltZXMxJTdEKyU1Q3RhZyU3QjElN0Q=.png)
写成齐次坐标矩阵乘法形式:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF9jKyU1QyU1QysrKyt5X2MrJTVDJTVDKysrK3pfYyU1QyU1QysxKyU1QyU1QysrKyU1Q2VuZCU3QnBtYXRyaXglN0QrJTNEJTVDYmVnaW4lN0JibWF0cml4JTdEKytSXyU3QjMlNUN0aW1lczMlN0QrJTI2K1RfJTdCMyU1Q3RpbWVzMSU3RCslNUMlNUMrMCU1RVQrJTI2MSslNUMlNUMrKyU1Q2VuZCU3QmJtYXRyaXglN0QrJTVDYmVnaW4lN0JwbWF0cml4JTdEKysrK3hfdyslNUMlNUMrKysreV93JTVDJTVDKysrK3pfdyU1QyU1QysxKyU1QyU1QysrKyU1Q2VuZCU3QnBtYXRyaXglN0QrJTNEKyU1Q2JlZ2luJTdCYm1hdHJpeCU3RCsrcl8lN0IxMSU3RCslMjYrcl8lN0IxMyU3RCslMjYrcl8lN0IxMyU3RCslMjYrdF94KyU1QyU1QytyXyU3QjIxJTdEKyUyNityXyU3QjIyJTdEKyUyNityXyU3QjIzJTdEKyUyNit0X3krJTVDJTVDK3JfJTdCMzElN0QrJTI2K3JfJTdCMzIlN0QrJTI2K3JfJTdCMzMlN0QrJTI2K3RfeislNUMlNUMrMCslMjYrMCslMjYrMCslMjYrMSsrJTVDZW5kJTdCYm1hdHJpeCU3RCU1Q2JlZ2luJTdCcG1hdHJpeCU3RCsrKyt4X3crJTVDJTVDKysrK3lfdyU1QyU1QysrKyt6X3clNUMlNUMrMSslNUMlNUMrKyslNUNlbmQlN0JwbWF0cml4JTdEJTVDdGFnJTdCMiU3RA==.png)
需要特别注意的是,其中旋转矩阵
是正交矩阵(即
,
是单位矩阵),这是一个非常重要的性质。
为何
是正交矩阵?这里从简单的情形说起。如下图将坐标系绕
轴旋转
角,用矩阵可以表示为:

![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD14JTI3KyUzRHgrJTVDY2RvdCslNUN0ZXh0JTdCY29zJTdEJTVDYWxwaGEteSU1Q2Nkb3QlNUN0ZXh0JTdCc2luJTdEJTVDdGhldGErJTVDJTVDK3klMjcrJTNEeCslNUNjZG90KyU1Q3RleHQlN0JzaW4lN0QlNUNhbHBoYSUyQnklNUNjZG90JTVDdGV4dCU3QmNvcyU3RCU1Q2FscGhhKyU1QyU1QysreiUyNyslM0QreislNUMlNUM=.png)
用矩阵可以表示为
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreCUyNyslNUMlNUMrKysreSUyNysrJTVDJTVDK3olMjcrKysrKyU1Q2VuZCU3QnBtYXRyaXglN0QrJTNEKyU1Q2JlZ2luJTdCYm1hdHJpeCU3RCsrKyslNUN0ZXh0JTdCY29zJTdEJTVDYWxwaGErJTI2Ky0lNUN0ZXh0JTdCc2luJTdEJTVDYWxwaGErJTI2KzAlNUMlNUMrKysrJTVDdGV4dCU3QnNpbiU3RCU1Q2FscGhhKyUyNislNUN0ZXh0JTdCY29zJTdEJTVDYWxwaGErJTI2KzArJTVDJTVDKzArJTI2KzArJTI2KzErKyU1Q2VuZCU3QmJtYXRyaXglN0QrJTVDYmVnaW4lN0JwbWF0cml4JTdEKysrK3grJTVDJTVDKysrK3krJTVDJTVDeislNUMlNUMrJTVDZW5kJTdCcG1hdHJpeCU3RCU1Q1JpZ2h0YXJyb3crUislM0QlNUNiZWdpbiU3QmJtYXRyaXglN0QrKysrJTVDdGV4dCU3QmNvcyU3RCU1Q2FscGhhKyUyNistJTVDdGV4dCU3QnNpbiU3RCU1Q2FscGhhKyUyNiswJTVDJTVDKysrKyU1Q3RleHQlN0JzaW4lN0QlNUNhbHBoYSslMjYrJTVDdGV4dCU3QmNvcyU3RCU1Q2FscGhhKyUyNiswKyU1QyU1QyswKyUyNiswKyUyNisxKyslNUNlbmQlN0JibWF0cml4JTdEKyU1Q3RhZyU3QjMlN0Q=.png)
显然有
成立。更复杂情况类似,感兴趣的朋友可以自行探索。
- 从相机坐标系到成像平面坐标系

现在已经以相机的视角看外部世界了,接下来要做的就是将外部世界的点投影在成像平面上。假设在光心
后距离
处有一个接收并记录光信号的传感器,那么传感器所在的平面就是成像平面。这里的
就是相机的物理焦距(单位:米)。
这是一个将三维空间中的点
通过光心
投影到成像平面的过程,并在成像平面形成倒像。这里有一个问题,为何平时我们用手机、数码相机拍照时生成的图片不是倒的?这是由于手机、数码相机等拍照设备内部软件在处理时做了自动翻转。
等效成像平面(虚像)
从侧面看上述模型,在光心前方
位置存在一个与成像平面对称的等效成像平面(等效成像平面中的像与成像平面的像大小一样且相反)。由于成像平面中的像是倒像(需要添加负号,不方便数学描述),我们不妨在等效成像平面看,并建立坐标系
。

那么在上图中,由相似三角形原理可以得出:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD14X24rJTNEK2YlNUNmcmFjJTdCeF9jJTdEJTdCel9jJTdEJTVDdGFnJTdCNCU3RA==.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0reV9uJTNEZiU1Q2ZyYWMlN0J5X2MlN0QlN0J6X2MlN0QlNUN0YWclN0I1JTdE.png)
将上式整理写成齐次坐标矩阵乘法形式:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16X2MlNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF9uKyU1QyU1QysrKyt5X24rJTVDJTVDKzErKyslNUNlbmQlN0JwbWF0cml4JTdEJTNEJTVDYmVnaW4lN0JibWF0cml4JTdEKysrKytmKyUyNjAlMjYwKyUyNiswKyU1QyU1QyswKyUyNitmKyUyNiswKyUyNiswKyU1QyU1QyswKyUyNiswKyUyNisxKyUyNiswKyU1Q2VuZCU3QmJtYXRyaXglN0QlNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF9jKyU1QyU1QysrKyt5X2MrJTVDJTVDKyt6X2MlNUMlNUMrMSslNUNlbmQlN0JwbWF0cml4JTdEJTVDdGFnJTdCNiU3RA==.png)
- 从成像平面坐标系到像素坐标系

对于现在的数字相机,一般使用CMOS或CCD作为传感器将光信号转换为电信号,并记录下来生成数字图像。与传统胶片不同,这类传感器是由一个个感光原件组成的。在工作时每个感光原件独立记录自己所接收到的光信号,导致生成的数字图像是离散的。简单说,数字图像就是一个由离散像素点组成的矩阵。

那么从成像平面坐标系
到像素坐标系
就是一个离散化的过程。之前所有坐标系(包括世界坐标系
、相机坐标系
、成像平面坐标系
)的单位都是连续的“米”,而
像素坐标系的单位是离散的“像素”。

从
到
的变换可以表示为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QnBtYXRyaXglN0QrKysrdSslNUMlNUMrKysrdislNUMlNUMrMSsrKyU1Q2VuZCU3QnBtYXRyaXglN0QlM0QlNUNiZWdpbiU3QmJtYXRyaXglN0QrKzErJTI2KzArJTI2K3VfMCslNUMlNUMrMCslMjYrMSslMjYrdl8wKyslNUMlNUMrMCslMjYrMCsrJTI2KzErJTVDZW5kJTdCYm1hdHJpeCU3RCU1Q2JlZ2luJTdCYm1hdHJpeCU3RCsrKysrJTVDZnJhYyU3QjElN0QlN0JkeCU3RCslMjYrMCslMjYrMCslNUMlNUMrMCslMjYrJTVDZnJhYyU3QjElN0QlN0JkeSU3RCslMjYrMCsrJTVDJTVDKzArJTI2KzArKyUyNisxKyU1Q2VuZCU3QmJtYXRyaXglN0QlNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF9uKyU1QyU1QysrKyt5X24rJTVDJTVDKzErKyslNUNlbmQlN0JwbWF0cml4JTdEJTVDdGFnJTdCNyU3RA==.png)
这个变换有两个步骤组成:
- 通过
和
将连续坐标量化为像素。其中
和
分别表示每个像素在
和
方向的实际大小(单位:米/像素),由相机传感器中每个感光原件大小决定。 - 由于数字图像一般习惯以左上角为原点,那么需要将图像对称中心从
位置平移
像素到左上角点。
这样,通过几个步骤相机将世界坐标系
中的点(单位:米)最终变换为像素坐标系
中的点(单位:像素)。那么最终变换关系是:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16X2MlNUNiZWdpbiU3QnBtYXRyaXglN0QrKysrdSslNUMlNUMrKysrdislNUMlNUMrMSsrKyU1Q2VuZCU3QnBtYXRyaXglN0QlM0QlNUNiZWdpbiU3QmJtYXRyaXglN0QrKysrKyU1Q2ZyYWMlN0JmJTdEJTdCZHglN0QlMjYwJTI2dV8wJTI2MCslNUMlNUMrMCslMjYrJTVDZnJhYyU3QmYlN0QlN0JkeSU3RCslMjYrdl8wKyUyNiswKyU1QyU1QyswKyUyNiswKyUyNisxKyUyNiswJTVDZW5kJTdCYm1hdHJpeCU3RCU1Q2JlZ2luJTdCYm1hdHJpeCU3RCsrUl8lN0IzJTVDdGltZXMzJTdEKyUyNitUXyU3QjMlNUN0aW1lczElN0QrJTVDJTVDKzAlNUVUKyUyNjErJTVDJTVDKyslNUNlbmQlN0JibWF0cml4JTdEJTVDYmVnaW4lN0JwbWF0cml4JTdEKysrK3hfdyslNUMlNUMrKysreV93KyU1QyU1Qysrel93KyU1QyU1QysxKyU1Q2VuZCU3QnBtYXRyaXglN0QlNUN0YWclN0I4JTdE.png)
其中
是相机物理焦距(单位:米),
和
表示每个像素在
和
方向的实际大小(单位:米/像素),
和
表示图像对称中心在
像素坐标系中的的位置(单位:像素)。简记为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16cCUzREslNUJSJTVDK1QlNURQJTVDdGFnJTdCOSU3RA==.png)
或更简记为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16cCUzRE1QJTVDdGFnJTdCMTAlN0Q=.png)
这里的
是相机内参矩阵,由相机内部光学物理结构决定。![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1LJTNEJTVDYmVnaW4lN0JibWF0cml4JTdEKysrKyslNUNmcmFjJTdCZiU3RCU3QmR4JTdEJTI2MCUyNnVfMCUyNjArJTVDJTVDKzArJTI2KyU1Q2ZyYWMlN0JmJTdEJTdCZHklN0QrJTI2K3ZfMCslMjYrMCslNUMlNUMrMCslMjYrMCslMjYrMSslMjYrMCU1Q2VuZCU3QmJtYXRyaXglN0QrKyU1Q3RhZyU3QjExJTdE.png)
当然由于最后一列为0,也记为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1LJTNEJTVDYmVnaW4lN0JibWF0cml4JTdEKysrKytmX3glMjYwJTI2dV8wKyU1QyU1QyswKyUyNitmX3klMjYrdl8wKyslNUMlNUMrMCslMjYrMCslMjYrMSslNUNlbmQlN0JibWF0cml4JTdEJTVDdGFnJTdCMTElN0Q=.png)
其中
,
。而
和
是相机外参矩阵,由相机摆放位置决定。显然相机标定就是计算内、外参矩阵的过程。
二、视觉测距
- 单目测距(单目距离估计)
那么有一个问题,在已知所有相机参数
、
和
的情况下,能否通过图像坐标
反推出对应的世界坐标
呢?

这里我们从几何关系上看:只要世界中的点
在
射线上,那么最终都会通过相机投影到图像中的
点,所以单摄像头无法精确测距。相机模型本质是一种从世界坐标系3D->像素坐标系2D的投影变换,在投影变换中丢失了深度
信息。
但是有时候我们又特别需要使用单个摄像头测距:一个典型场景就是在车辆自动驾驶中使用单摄像头识别前方车辆并测距。一般的做法是加入一定的约束条件后单目估计距离。假设相机
轴与水平地面平行,到地面高度为
,且被测物体在地面上(加入的约束条件);在相机下方
距离有一个标定板,上面画的是与
轴水平距离的刻度。在测距前首先拍摄一张标定板图像;当测距时可以根据地面上的物体在图像中的位置读取
,此时可以估计出地面物体与相机真实距离为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1kJTNEaCU1Q2ZyYWMlN0JkXzElN0QlN0JoXzElN0QlNUN0YWclN0IxMiU3RA==.png)
其中
和
已知,而
可以从标定板图像中读取出来。需要说明,这只是一种估计方法,并非精确计算。

- 双目测距
再来看看双目(即两个相机)的测距问题。为了简化问题,假设在同一平面有
和
两个完全一样的相机,他们的相机坐标系
与
轴在同一直线上且
平行于
。显然可以通过测量获得两个相机间的距离
,然后通过标定可以知道相机
、
、
和
参数。

某宝的双目测距模块(左右相机一样+相机z_c光轴平行)
特别注意,双目测距要求两个相机坐标轴
和
平行,否则就是对极几何问题了。

双目测距
那么两个相机分别对远处距离
处同一目标拍照得到左、右张两张图像。由于视角不同,同一点在两张图像像素位置不同,即存在视差
。
已知相机坐标系
变换为像素坐标系
的公式为:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16X2MlNUNiZWdpbiU3QnBtYXRyaXglN0QrKysrdSslNUMlNUMrKysrdislNUMlNUMrMSsrKyU1Q2VuZCU3QnBtYXRyaXglN0QlM0QlNUNiZWdpbiU3QmJtYXRyaXglN0QrKysrK2ZfeCUyNjAlMjZ1XzAlMjYwKyU1QyU1QyswKyUyNitmX3krJTI2K3ZfMCslMjYrMCslNUMlNUMrMCslMjYrMCslMjYrMSslMjYrMCU1Q2VuZCU3QmJtYXRyaXglN0QlNUNiZWdpbiU3QnBtYXRyaXglN0QrKysreF9jKyU1QyU1QysrKyt5X2MrJTVDJTVDKyt6X2MrJTVDJTVDKzErJTVDZW5kJTdCcG1hdHJpeCU3RCU1Q3RhZyU3QjEzJTdE.png)
其中
,
。那么从上式得出,对于左边的相机:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16X2MlNUNjZG90K3UlM0RmX3h4X2MlMkJ6X2MlNUNjZG90K3VfMCU1Q3RhZyU3QjE0JTdE.png)
对于右边的相机:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16JTI3X2MlNUNjZG90K3UlMjclM0RmX3h4JTI3X2MlMkJ6JTI3X2MlNUNjZG90K3VfMCU1Q3RhZyU3QjE1JTdE.png)
其中
。上面两式相减得:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16X2MlNUNjZG90K2QlM0RmX3glMjh4JTI3X2MteF9jJTI5JTVDdGFnJTdCMTYlN0Q=.png)
由于
,那么有:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16X2MlNUNjZG90K2QlM0RmX3glMjgtdF94JTI5JTVDUmlnaHRhcnJvdyslN0N6X2MlN0MlM0RmX3glNUNjZG90KyU3QyU1Q2ZyYWMlN0J0X3glN0QlN0JkJTdEJTdDJTVDdGFnJTdCMTclN0Q=.png)
其中
可以通过相机标定获得,
可以测量获得,
可以通过左、右张两张图像计算视差获得,则
能够精确计算出来。
虽然可以通过双目可以精确测距,但是在实际中也存在问题:
- 双目测距要求
和
轴平行,测距精度严重依赖于
和
的平行程度。 - 为了计算视差
,需要匹配世界中同一点
在左右两幅图像中的像素点
和
,即双目立体匹配。在复杂光照和复杂场景下,如何准确双目立体匹配本身就是很难的问题。 - 对于世界中越远的点
,其在左右视图中的视差
越小,测距结果越容易受到双目立体匹配误差影响(即双目测距精度与被测物体距离成反相关)。

所以,单目估计距离简单但是不精确,双目测距精确但是算法复杂且不稳定。
三、深度学习在视觉测距中的发展
当然,目前也有使用深度学习网络单目距离估计的方法:
第一篇使用深度学习单目网络估计距离的文章发表在NIPS 2014,核心思想就是先得到一个低分辨率的Coarse深度图,再通过网络refine得到高精度距离图。

到了后来,如CVPR 2017这篇加入多级估计距离方法,即每一级
在上一级
估计的基础上继续精细化估计,并且加入条件随机场CRF修正网络结果。

目前CVPR 2020有文章通过边缘和边界来进一步提高深度学习深度估计网络的结果。

综合来说,使用深度学习网络单目距离估计是个是典型的缺乏理论支持的工作,纯粹依赖于大型深度学习网络的拟合能力。目前对于特定的场景(如室内环境,卧室,客厅等),深度学习网络可以进行较为准确的单目距离估计,但是很难推广到任意场景。
为了保住头顶的头发,建议还是别在工程中用了。。。
