相機模型與視覺測距:
一、相機數學模型
- 從世界坐標系到相機坐標系

假設在某間房子中放了一台相機拍照。為了方便測量,我們以房子的某處牆角為原心建立直角坐標系,即世界坐標系。為了研究相機模型,要做的第一步就是將世界坐標系轉化為以相機光心為原點的相機坐標系,以相機的視角來“看”外部世界。
從世界坐標系
到以相機光心為坐標原點的
的相機坐標系,實際上就是一個三維直角坐標系的旋轉與平移變換,可以表示為:
![[公式]](/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有文章通過邊緣和邊界來進一步提高深度學習深度估計網絡的結果。

綜合來說,使用深度學習網絡單目距離估計是個是典型的缺乏理論支持的工作,純粹依賴於大型深度學習網絡的擬合能力。目前對於特定的場景(如室內環境,卧室,客廳等),深度學習網絡可以進行較為准確的單目距離估計,但是很難推廣到任意場景。
為了保住頭頂的頭發,建議還是別在工程中用了。。。
