要求:對給出的左右視圖進行匹配,最后輸出左右兩張disparity map(視差圖)
e.g.
左視圖、右視圖(兩幅圖像大小相同,只有水平方向上的視角變換)
標准視差圖如下:
SSD(sum of squared differences)實現:
1.把左右視圖轉成CV_8UC1單通道圖像
可以直接引用opencv的API實現、自己寫一個對三通道取平均值或者按照下面公式轉換的函數,對結果影響不大
2.對每一個像素進行處理
假設dmax=79,則有,對於每個像素的每個d值,計算patch(滑動窗口)內左右視圖的像素灰度值的平方差之和,然后記錄該值與其對應的d值
此處可以用vector<pair<sum, d>>來存儲結果
3. 取最小sum值對應的d做為最終輸出的disparity map對應點的灰度值
result:5*5 窗口,壞點率分別為24,72%, 25.78%
NCC(normalized cross-correlation)實現:
1. 同樣,先把左右視圖轉成單通道灰度圖
2. 然后對於每個像素做處理,對於每個對應的d值,先計算分子,在計算分母,最后把分子/分母的值與對應d值存入vector中
3.取vector中最大值對應的d值為disparity map在該點的灰度值
result:5*5窗口 壞點率:23.64%, 24.20% 比SSD稍微好一點
ASW(Adaptive Support Weight)實現:
這個就按公式實現,比較簡單,如果窗口足夠大的話,ASW的處理效果會比較好,但是會很慢
但是中間計算Cpq值的時候主要要把BGR模型轉換成Lab模型計算
result:5*5 窗口大小,壞點率:31.33% , 31.39%
33*33窗口大小,壞點率:19.44% , 20.75%(但是,跑了9242 seconds...可以自行感受一下...
代碼實現:https://github.com/CheerM/opencv_stereo_matching/tree/master/src
BTW,哪位勇士跑完全部測例的ASW 33*33,能不能順便分享一下數據給我看看,感激不盡啊> <