模擬人的兩隻眼睛的Stereo相機最近變得很受歡迎。通過對stereo相機拍攝的左右兩張圖進行匹配找出視差圖,可以還原物體的3D信息。
立體匹配(Stereo matching)的步驟如下:
1: 預處理:亮度歸一化,去噪,圖像增強,濾波等等
2: 匹配Cost計算Cost aggregation
每個像素點的matching cost可用下圖所示的兩種方式表示
將所有像素的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中的應用 立體匹配算法(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提供了以下四種立體匹配算法的函數:
-
Block Matching(BM) StereoBM
-
Semi-Global Block Matching(SGBM) StereoSGBM
-
Graph Cut(GC)cvStereoGCState()
-
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中的應用]()
匹配結果如下:
精度與速度統計圖如下: