雙camera景深計算 (1)


http://www.52rd.com/S_TXT/2016_6/TXT85047.HTM?WebShieldDRSessionVerify=Wz3h6srvu76qRI4MFxK8

前面介紹了雙camera能實現的功能中其中很大的一類都是依賴於景深的計算。現在這類功能在手機上的應用也是相對成熟的。在這類功能中景深的計算是很重要的,如何計算景深,計算的准確性和性能都是決定最后能夠實現什么樣功能的關鍵。

  很多人都會說其實我們從一張照片中也能看出哪個物體在前,哪個物體在后。這其實這是建立在我們大腦的一些視覺經驗的基礎上。比如近大遠小,又比如物體影子的位置。這些經驗確實很重要,但是在實際的計算機視覺中很難使用相同的方法,並且在很多情況即使人眼也沒有辦法分辨景深。比如說下面這個網上很熱的圖,哪個樓在前。

 

 

  還有下圖這種情況,利用平面上的圖像在特殊的視覺角度。造成人的虛假3D視覺。

 

 

  在僅僅從張圖片中看在一條直線上的物體,很多不同距離的點再圖片上映射的位置其實是一個。如下圖的P和Q。光從照片無法得到距離信息。

 

 

  而在實際場景,人眼分辨景深主要是依靠雙目視覺分辨景深。這和雙camera分辨景深的原理一樣。主要方法是依靠三角定位的方法如下圖。不過需要注意的是,下面這個公式是基於兩個平行的完全相同的camera實現的。

 

 

 

 

  從公式中可以得判斷Z的距離中d和X的大小很關鍵.兩個攝像頭間的距離D很重要減少D的距離不僅會減少能測量的最大距離而且會減少相對景深間精度。而X的精度更多取決於像素的大小。在實際計算中不會小於一個像素。

  實際計算中有的時候會將最大和最小距離間分割成多個不同平面。每個平面之間的精度由算法的實際精度決定。這樣可以較少一些在景深計算中誤差導致的精度的問題。

 

 

  上面的公式是基於兩個平行的相同camera的。但是實際使用的時候實際上有很多問題。比如在上圖兩個camera計算景深中總有一部分場景不能相交。因此實際的為了景深計算兩個camera的FOV設計會不一樣。主camera是用來取實際圖的,副camera的圖像主要是用來參考計算景深。副camera的FOV一般會大於主camera. 但是即使是這樣距離較近的物體依然有可能不同時在兩個camera圖像當中。經過調整的計算景深范圍的關系如下圖。

 

 

  但是這么計算之后的問題是由於兩個攝像頭的成像和物體的放縮比不一樣。因此這么做之后在計算距離的時候要考慮將圖像的放縮比變換成一樣。實際上不僅是放縮比,包括畸變和姿勢差。這在計算景深的都是很重要的矯正。本篇文章不以校准和矯正為主要內容

  通過在左右兩張圖計算出不同點差異的圖一般叫Disparity Map,這個圖上表示的是兩張圖上相同點的位移差異,但是由於三角定位中的位移差異和Z成正比,因此很多時候Disparity Map 就直接被用作景深圖。多數時候這個圖是以灰度圖的形式進行存儲。

 

 

  下圖是如何通關過 Disparity Map 重建3D場景的過程。

 

 

  計算景深的常用幾個重要流程如下圖。其中最后一步是用來3D重建,現在很多場景中並不單獨使用。其中calibration和矯正是密切相關的,后面有機會我們可以單獨討論。本文主要討論如何計算兩張圖的立體相關性這部分。

 

 

  另外一個實際問題從圖上看我們找到X1和X2似乎很簡單。但是在實際圖中如何能找到兩個相同的點呢?當然全圖找可以,但是如果全圖尋找類似點的話精度或者這個問題其實也是雙camera算法計算景深中的最重要算法重要問題。在實際使用狀況下兩個相機的坐標無任何約束關系,相機的內部參數可能不同,甚至是未知的。要刻畫這種情況下的兩幅圖像之間的對應關系,需要引入一個重要的概念對極幾何(Epipolargeometry)。其中有兩個重要的概念兩個重要的概念——對極矩陣(EpipolarMatrix)和基本矩陣(FundamentalMatrix)。這中間是描述兩個camera圖像中點對應的規律的。

 

 

 

 

  多數算法在真正計算兩張圖之前首先要做的就是糾正兩個camera圖像的之間的對應關系。將極線糾正到平行,這樣有利於后面的計算。

 

 

  根據對極幾何和矯正之后的圖片,我們可以得到如何去搜索對應的點方法。但是在對應的極線上怎么來判斷點是一樣呢?常用的類似相關系數,或者Lucas-Kanade算法更適合計算整張圖之間的位移的差異。在計算兩個點之間的差異並怒好用。在成像系統中如果想單獨從兩個點的值來判斷兩個點是否一樣也是有一些問題要解決,不僅兩個camera本身的成像上就有差異,而且即使同一個camera拍攝過程中也會有噪聲影響。因此僅用一個像素很難正確的找到對應像素的,多數情況下還是要借助周邊的像素信息。一種比較簡單且常用的方法是使用一個windows去尋找差異比使用一個像素會更好一些。因為在一個windows中有更多的紋理和差異信息方便比較。再根據之前矯正之后的圖片逐個去比較是否相似就好了。

 

 

 

 

  比較窗口里面的信息是否相同就可以使用很多圖像匹配的方法了。比較簡單的如計算像素亮度的SSD,絕對差等方法,也就是計算兩塊中相對的像素間的差值的平方或者絕對值。當然也可以用其它更加魯棒的圖像匹配算法,比如Opencv里面的RobustMatch算法。網上有文章大家可以自己找來看看。這里只是示意景深計算的過程。

  SSD計算公式如下:

 

 

  然后最簡單的方法就是選擇所有格子計算結果E最小的D作為差異。

 

 

  但是同時又有了新的問題。當W選取比較小的時候景深圖的噪聲依然很大,而W選取大的時候景深圖在X,Y方向上的分辨率犧牲又比較大。如何選擇W大小需要在實際使用中根據需求驚醒選擇。下面是同一張圖在W為3X3和20X20像素的時候計算的結果。

 

 

  即使是我們選擇了一個較好的窗口,但是在很多情況就和下圖一樣得到的景深圖依然不能十分滿意。這是由於這個算法本身很多時候還有很多誤判的時候。

 

 

  景深圖的計算的改進和算法中的預處理,圖像匹配算法,還有景深圖的后處理都有關系。下面是一個傳統景深圖的算法和改進算法的比較。

 

 

  不過就和其它算法一樣,計算景深也不止一種算法,在實際應用中的算法中經常會用很多不同的處理辦法來解決不同的問題。有些改進辦法是從源圖的處理入手,有些是從處理之后的景深圖進行改進,還有一些是利用濾波器,GPU,甚至機器學習的方法提高景深的計算速度和精度。下一篇中我們進一步的探討一些簡單的改進景深圖計算的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM