雙camera景深計算(1)
來自專欄 All in Camera4 人贊了文章
本文系微信公眾號《大話成像》,知乎專欄《all in camera》原創文章
大話成像讀者QQ交流群 :237427716 大話計算機視覺QQ交流群:651805282
本站教學視頻大話成像之《數字成像系統》32講已上線淘寶,搜索關鍵字『大話成像』即可找到,或使用鏈接
PC用戶: https://item.taobao.com/item.htm?id=568925736204:
手機用戶可使用鏈接: 複製這條信息¥adMo0tqbc2N¥後打開手淘
請購買了視頻的讀者加入QQ群:679050565,群名稱:數字成像系統課程,驗證消息請輸入購買課程時候的個人ID。
作者:Zhang Eric
前面介紹了雙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演算法計算景深中的最重要演算法重要問題。在實際使用狀況下兩個相機的坐標無任何約束關係,相機的內部參數可能不同,甚至是未知的。要刻畫這種情況下的兩幅圖像之間的對應關係,需要引入一個重要的概念對極幾何(Epipolar
geometry)。其中有兩個重要的概念兩個重要的概念——對極矩陣(EpipolarMatrix)和基本矩陣(Fundamental Matrix)。這中間是描述兩個camera圖像中點對應的規律的。多數演算法在真正計算兩張圖之前首先要做的就是糾正兩個camera圖像的之間的對應關係。將極線糾正到平行,這樣有利於後面的計算。
根據對極幾何和矯正之後的圖片,我們可以得到如何去搜索對應的點方法。但是在對應的極線上怎麼來判斷點是一樣呢?常用的類似相關係數,或者Lucas-Kanade演算法更適合計算整張圖之間的位移的差異。在計算兩個點之間的差異並怒好用。在成像系統中如果想單獨從兩個點的值來判斷兩個點是否一樣也是有一些問題要解決,不僅兩個camera本身的成像上就有差異,而且即使同一個camera拍攝過程中也會有雜訊影響。因此僅用一個像素很難正確的找到對應像素的,多數情況下還是要藉助周邊的像素信息。一種比較簡單且常用的方法是使用一個windows去尋找差異比使用一個像素會更好一些。因為在一個windows中有更多的紋理和差異信息方便比較。
可以將全圖打成格子然後。再根據之前矯正之後的圖片逐個去比較是否相似就好了。
比較Windows裡面的信息是否相同就可以使用很多圖像匹配的方法了。比較簡單的如計算像素亮度的SSD,絕對差等方法,也就是計算兩塊中相對的像素間的差值的平方或者絕對值。當然也可以用其它更加魯棒的圖像匹配演算法,比如Opencv裡面的RobustMatch演算法。網上有文章大家可以自己找來看看。這裡只是示意景深計算的過程。
SSD計算公式如下:
然後最簡單的方法就是選擇所有格子計算結果E最小的D作為差異。
但是同時又有了新的問題。當W選取比較小的時候景深圖的雜訊依然很大,而W選取大的時候景深圖在X,Y方向上的解析度犧牲又比較大。如何選擇W大小需要在實際使用中根據需求驚醒選擇。下面是同一張圖在W為3X3和20X20像素的時候計算的結果 。
即使是我們選擇了一個較好的W,但是在很多情況就和下圖一樣得到的景深圖依然不能十分滿意。這是由於這個演算法本身很多時候還有很多誤判的時候。
景深圖的計算的改進和演算法中的預處理,圖像匹配演算法,還有景深圖的後處理都有關係。下面是一個傳統景深圖的演算法和改進演算法的比較。
不過就和其它演算法一樣,計算景深也不止一種演算法,在實際應用中的演算法中經常會用很多不同的處理辦法來解決不同的問題。有些改進辦法是從源圖的處理入手,有些是從處理之後的景深圖進行改進,還有一些是利用濾波器,GPU,甚至機器學習的方法提高景深的計算速度和精度。下一篇中我們進一步的探討一些簡單的改進景深圖計算的方法。
歡迎大家關注我們的公眾號大話成像和大話計算機視覺,並加入我們的兩個QQ交流群交流一些工作學習中的問題 。
推薦閱讀:
※曝光補償的正確使用方法
※美人攝影:舊事如天遠
※來自「中國最冷小鎮」呼中的攝影作品
※攝影師張玫鏡頭下晚秋的鏡泊湖
※鏡間Pro | 祿來hy6