1. 程式人生 > >【深度相機系列三】深度相機原理揭祕--雙目立體視覺

【深度相機系列三】深度相機原理揭祕--雙目立體視覺

本文已經首發在個人微信公共號:計算機視覺life(微訊號CV_life,歡迎關注!


導讀

為什麼非得用雙目相機才能得到深度?

雙目立體視覺深度相機的工作流程

雙目立體視覺深度相機詳細工作原理

    理想雙目相機成像模型

    極線約束

    影象矯正技術

    基於滑動視窗的影象匹配

    基於能量優化的影象匹配

雙目立體視覺深度相機的優缺點

---------------------------------------------------


基於雙目立體視覺的深度相機類似人類的雙眼,和基於TOF、結構光原理的深度相機不同,它不對外主動投射光源,完全依靠拍攝的兩張圖片(彩色RGB或者灰度圖)來計算深度,因此有時候也被稱為被動雙目深度相機。比較知名的產品有STEROLABS 推出的 ZED 2K Stereo Camera和Point Grey 公司推出的 BumbleBee。

ZED 2K Stereo Camera



為什麼非得用雙目相機才能得到深度?


說到這裡,有些讀者會問啦:為什麼非得用雙目相機才能得到深度?我閉上一隻眼只用一隻眼來觀察,也能知道哪個物體離我近哪個離我遠啊!是不是說明單目相機也可以獲得深度?


在此解答一下:首先,確實人通過一隻眼也可以獲得一定的深度資訊,不過這背後其實有一些容易忽略的因素在起作用:一是因為人本身對所處的世界是非常瞭解的(先驗知識),因而對日常物品的大小是有一個基本預判的(從小到大多年的視覺訓練),根據近大遠小的常識確實可以推斷出影象中什麼離我們遠什麼離我們近;二是人在單眼觀察物體的時候其實人眼是晃動的,相當於一個移動的單目相機,這類似於運動恢復結構(Structure from Motion, SfM)的原理,移動的單目相機通過比較多幀差異確實可以得到深度資訊。


但是實際上,相機畢竟不是人眼,它只會傻傻的按照人的操作拍照,不會學習和思考。下圖從物理原理上展示了為什麼單目相機不能測量深度值而雙目可以的原因。我們看到紅色線條上三個不同遠近的黑色的點在下方相機上投影在同一個位置,因此單目相機無法分辨成的像到底是遠的那個點還是近的那個點,但是它們在上方相機的投影卻位於三個不同位置,因此通過兩個相機的觀察可以確定到底是哪一個點。


雙目相機確定深度示意圖



雙目立體視覺深度相機簡化流程


下面簡單的總結一下雙目立體視覺深度相機的深度測量過程,如下:


1、首先需要對雙目相機進行標定,得到兩個相機的內外引數、單應矩陣。

2、根據標定結果對原始影象校正,校正後的兩張影象位於同一平面且互相平行。

3、對校正後的兩張影象進行畫素點匹配。

4、根據匹配結果計算每個畫素的深度,從而獲得深度圖。


欲知詳情,且看下面詳細介紹。



雙目立體視覺深度相機詳細原理


1、理想雙目相機成像模型

首先我們從理想的情況開始分析:假設左右兩個相機位於同一平面(光軸平行),且相機引數(如焦距f)一致。那麼深度值的推導原理和公式如下。公式只涉及到初中學的三角形相似知識,不難看懂。


理想情況下雙目立體視覺相機深度值計算原理


根據上述推導,空間點P離相機的距離(深度)z=f*b/d,可以發現如果要計算深度z,必須要知道:


1、相機焦距f,左右相機基線b。這些引數可以通過先驗資訊或者相機標定得到。


2、視差d。需要知道左相機的每個畫素點(xl, yl)和右相機中對應點(xr, yr)的對應關係。這是雙目視覺的核心問題。


2、極線約束

那麼問題來了,對於左圖中的一個畫素點,如何確定該點在右圖中的位置?是不是需要我們在整個影象中地毯式搜尋一個個匹配?


答案是:不需要。因為有極線約束(名字聽著很嚇人)。極線約束對於求解影象對中畫素點的對應關係非常重要。


那什麼是極線呢?如下圖所示。C1,C2是兩個相機,P是空間中的一個點,P和兩個相機中心點C1、C2形成了三維空間中的一個平面PC1C2,稱為極平面(Epipolar plane)。極平面和兩幅影象相交於兩條直線,這兩條直線稱為極線(Epipolar line)。P在相機C1中的成像點是P1,在相機C2中的成像點是P2,但是P的位置事先是未知的。


我們的目標是:對於左圖的P1點,尋找它在右圖中的對應點P2,這樣就能確定P點的空間位置,也就是我們想要的空間物體和相機的距離(深度)。


所謂極線約束(Epipolar Constraint)就是指當同一個空間點在兩幅影象上分別成像時,已知左圖投影點p1,那麼對應右圖投影點p2一定在相對於p1的極線上,這樣可以極大的縮小匹配範圍。


根據極線約束的定義,我們可以在下圖中直觀的看到P2一定在對極線上,所以我們只需要沿著極線搜尋一定可以找到和P1的對應點P2。


極線約束示意圖


細心的朋友會發現上述過程考慮的情況(兩相機共面且光軸平行,引數相同)非常理想,相機C1,C2如果不是在同一直線上怎麼辦?


事實上,這種情況非常常見,因為有些場景下兩個相機需要獨立固定,很難保證光心C1,C2完全水平,即使是固定在同一個基板上也會因為裝配的原因導致光心不完全水平。如下圖所示。我們看到兩個相機的極線不僅不平行,還不共面,之前的理想模型那一套推導結果用不了了,這可咋辦呢?


非理想情況下的極線


不急,有辦法。我們先來看看這種情況下拍攝的兩張左右圖片吧,如下所示。左圖中三個十字標誌的點,在右圖中對應的極線是右圖中的三條白色直線,也就是對應的搜尋區域。我們看到這三條直線並不是水平的,如果進行逐點搜尋效率非常低。


左圖中三個點(十字標誌)在右圖中對應的極線是右圖中的三條白色直線


3、影象矯正技術

怎麼辦呢?把不理想情況轉化為理想情況不就OK了!這就是影象矯正(Image Rectification)技術。


影象矯正是通過分別對兩張圖片用單應(homography)矩陣變換(可以通過標定獲得)得到的,的目的就是把兩個不同方向的影象平面(下圖中灰色平面)重新投影到同一個平面且光軸互相平行(下圖中黃色平面),這樣就可以用前面理想情況下的模型了,兩個相機的極線也變成水平的了。


影象校正示意圖


經過影象矯正後,左圖中的畫素點只需要沿著水平的極線方向搜尋對應點就可以了(開心)。從下圖中我們可以看到三個點對應的視差(紅色雙箭頭線段)是不同的,越遠的物體視差越小,越近的物體視差越大,這和我們的常識是一致的。


影象校正後的結果。紅色雙箭頭線段是對應點的視差


上面講到的對於左圖的一個點,沿著它在右圖中水平極線方向尋找和它最匹配的畫素點,說起來簡單,實際操作起來卻不容易。這是因為上述都是理想情況下的假設。實際進行畫素點匹配的時候會發現幾個問題:


1、實際上要保證兩個相機完全共面且引數一致是非常困難的,而且計算過程中也會產生誤差累積,因此對於左圖的一個點,其在右圖的對應點不一定恰好在極線上。但是應該是在極線附近,所以搜尋範圍需要適當放寬。


2、單個畫素點進行比較魯棒性很差,很容易受到光照變化和視角不同的影響。


4、基於滑動視窗的影象匹配

上述問題的解決方法:使用滑動視窗來進行匹配。如下圖所示。對於左圖中的一個畫素點(左圖中紅色方框中心),在右圖中從左到右用一個同尺寸滑動視窗內的畫素和它計算相似程度,相似度的度量有很多種方法,比如 誤差平方和法(Sum of Squared Differences,簡稱SSD),左右圖中兩個視窗越相似,SSD越小。下圖中下方的SSD曲線顯示了計算結果,SSD值最小的位置對應的畫素點就是最佳的匹配結果。



滑動視窗匹配原理示意圖


具體操作中還有很多實際問題,比如滑動視窗尺寸。滑動視窗的大小選取還是很有講究的。下圖顯示了不同尺寸的滑動視窗對深度圖計算結果的影響。從圖中我們也不難發現:


小尺寸的視窗:精度更高、細節更豐富;但是對噪聲特別敏感

大尺寸的視窗:精度不高、細節不夠;但是對噪聲比較魯棒


不同尺寸的滑動視窗對深度圖計算結果的影響


雖然基於滑動視窗的匹配方法可以計算得到深度圖,但是這種方法匹配效果並不好,而且由於要逐點進行滑動視窗匹配,計算效率也很低。


5、基於能量優化的影象匹配

目前比較主流的方法都是基於能量優化的方法來實現匹配的。能量優化通常會先定義一個能量函式。比如對於兩張圖中畫素點的匹配問題來說,我們定義的能量函式如下圖公式1。我們的目的是:


1、在左圖中所有的畫素點和右圖中對應的畫素點越近似越好,反映在影象裡就是灰度值越接近越好,也就是下圖公式2的描述。


2、在 同一張圖片裡,兩個相鄰的畫素點視差(深度值)也應該相近。也就是下圖公式3的描述。


能量函式


上述公式1代表的能量函式就是著名的馬爾科夫隨機場(Markov Random Field)模型。通過對能量函式最小化,我們最後得到了一個最佳的匹配結果。有了左右圖的每個畫素的匹配結果,根據前面的深度計算公式就可以得到每個畫素點的深度值,最終得到一幅深度圖。



雙目立體視覺法優缺點


根據前面的原理介紹,我們總結一下基於雙目立體視覺法深度相機的優缺點。


1、優點

1)、對相機硬體要求低,成本也低。因為不需要像TOF和結構光那樣使用特殊的發射器和接收器,使用普通的消費級RGB相機即可。


2)、室內外都適用。由於直接根據環境光采集影象,所以在室內、室外都能使用。相比之下,TOF和結構光基本只能在室內使用。


2、缺點

1)、對環境光照非常敏感。雙目立體視覺法依賴環境中的自然光線採集影象,而由於光照角度變化、光照強度變化等環境因素的影響,拍攝的兩張圖片亮度差別會比較大,這會對匹配演算法提出很大的挑戰。如下圖是在不同光照條件下拍攝的圖片:


不同光照下的影象對比


另外,在光照較強(會出現過度曝光)和較暗的情況下也會導致演算法效果急劇下降。


2)、不適用於單調缺乏紋理的場景。由於雙目立體視覺法根據視覺特徵進行影象匹配,所以對於缺乏視覺特徵的場景(如天空、白牆、沙漠等)會出現匹配困難,導致匹配誤差較大甚至匹配失敗。

紋理豐富(左)和紋理缺乏場景(右)


3)、計算複雜度高。該方法是純視覺的方法,需要逐畫素計算匹配;又因為上述多種因素的影響,需要保證匹配結果比較魯棒,所以演算法中會增加大量的錯誤剔除策略,因此對演算法要求較高,想要實現可靠商用難度大,計算量較大。


4)、相機基線限制了測量範圍。測量範圍和基線(兩個攝像頭間距)關係很大:基線越大,測量範圍越遠;基線越小,測量範圍越近。所以基線在一定程度上限制了該深度相機的測量範圍。