1. 程式人生 > >立體匹配演算法(Stereo Matching)及其在OpenCV中的應用

立體匹配演算法(Stereo Matching)及其在OpenCV中的應用

模擬人的兩隻眼睛的Stereo相機最近變得很受歡迎。通過對stereo相機拍攝的左右兩張圖進行匹配找出視差圖,可以還原物體的3D資訊。 立體匹配(Stereo matching)的步驟如下: 1: 預處理:亮度歸一化,去噪,影象增強,濾波等等 2: 匹配Cost計算Cost aggregation       每個畫素點的matching cost可用下圖所示的兩種方式表示      立體匹配演算法(Stereo <wbr>Matching)及其在OpenCV中的應用    將所有畫素的Cost加起來,選擇和最小的方案。 3: 全域性最優化 4: 後處理:Refinement 精化 一般基於畫素點的匹配含有較大的噪音,所以人們更願意使用基於區域性或全域性的匹配演算法。常用的立體匹配演算法可分為基於區域性的匹配方法和基於全域性的匹配方法。 (1)基於區域性的匹配演算法:塊匹配,模板匹配,SIFT[1]
,SURF[2],AKAZE[3] (2)基於全域性的匹配演算法:首先定義Cost Function,然後根據約束條件優化Cost Function.
  •       Dynamic Programming
  •            Scaling Optimization
  •            Graph Cuts
  •            Belief Propagation:Markov Random Field
           一般的Cost Function如下:ED基於畫素的亮度,Es基於畫素鄰居之間的Smoothness。                     立體匹配演算法(Stereo <wbr>Matching)及其在OpenCV中的應用
       在這裡簡單介紹後兩種全域性匹配演算法:        1:Graph Cut: 將每一個畫素看作Graph中的一個Node,然後假設該圖有L個不同的深度值,則新增L個            新的Node作為Label,然後求視差圖的問題就變成了多重Labelling的問題了,具體Graph Cut參照文            獻[4]。    2:Belief Propagation: 將影象看作馬爾科夫隨機場,則求視差問題變成了最大化聯合後驗概率的問題,
             每一個畫素對其深度值的猜測來自於其鄰居給的資訊,然後再把資訊傳給其他的鄰居。每一個資訊有                    一個可靠度(概率)。最後經過多次迴圈深度值會收斂。   [2]Herbert Bay,Tinne Tuytelaars, and Luc Van Gool,SURF: Speeded Up Robust Features,ECCV,2006   [4]Yuri Boykov and Vladimir Kolmogorov (2003), "Computing Geodesics and Minimal Surfaces via Graph Cuts"
  OpenCV提供了以下四種立體匹配演算法的函式:
  1.      Block Matching(BM) StereoBM
  2.      Semi-Global Block Matching(SGBM) StereoSGBM
  3.      Graph Cut(GC)cvStereoGCState()
  4.      Dynamic Programming(DP)cvFindStereoCorrespondence()
  第一種就是簡單的塊匹配,第三,四種是基於全域性的匹配,以下簡單介紹一下第二種演算法。我們知道區域性匹配   計算量小速度快,而全域性匹配計算量大速度慢,所以作者提出了SGBM演算法[5]:      第一步對每一個Pixel使用塊匹配BM進行匹配,得到了全部Pixel的disparity map。      第二步對Disparity map建立圖,用Graph Cut對其進行全域性優化。利用Rectification將二維轉化為一維:        則對每一個畫素的可能的Disparity值d,從以下4中裡面選取一個最小值:
  • 左相鄰畫素disparity取值為d時,其最小的cost值。
  • 左相鄰畫素disparity取值為d-1時,其最小的cost值+懲罰1。
  • 左相鄰畫素disparity取值為d+1時,其最小的cost值+懲罰1。
  • 左相鄰畫素disparity取值為其他時,其最小的cost值+懲罰2。
        它與GC的區別在於它的左相鄰畫素的Disparity是已知的(根據塊匹配結果),而GC是未知的,所以GC   要對每一種取值進行一次計算,計算量比SGBM要大得多。   [5]H. Hirschmuller, Stereo Processing by Semi-global Matching and Mutual Information,"IEEE Transactions on Pattern Analysis and Machine          Intelligence, Vol. 30, Issue 2, pp. 328-341, Feb. 2008.      下圖給出了各種不同演算法的結果比較:      左右原圖如下:      立體匹配演算法(Stereo <wbr>Matching)及其在OpenCV中的應用
    匹配結果如下:
立體匹配演算法(Stereo <wbr>Matching)及其在OpenCV中的應用      精度與速度統計圖如下:                                   立體匹配演算法(Stereo <wbr>Matching)及其在OpenCV中的應用