Opencv立體匹配演算法BM、SGBM、GC演算法的狀態引數
原文來源:http://blog.csdn.net/chenyusiyuan/article/details/5967291
本文效果圖資原始碼:http://download.csdn.net/detail/this_is_chris/9565697,VS2010+opencv248實現。
如何設定BM、SGBM和GC演算法的狀態引數?
(1)StereoBMState
// 預處理濾波引數
-
preFilterType:預處理濾波器的型別,主要是用於降低亮度失真(photometric distortions)、消除噪聲和增強紋理等, 有兩種可選型別:CV_STEREO_BM_NORMALIZED_RESPONSE(歸一化響應) 或者 CV_STEREO_BM_XSOBEL(水平方向Sobel運算元,預設型別)
- preFilterSize:預處理濾波器視窗大小,容許範圍是[5,255],一般應該在 5x5..21x21 之間,引數必須為奇數值, int 型
- preFilterCap:預處理濾波器的截斷值,預處理的輸出值僅保留[-preFilterCap, preFilterCap]範圍內的值,引數範圍:1 - 31(文件中是31,但程式碼中是 63), int
// SAD 引數
- SADWindowSize:SAD視窗大小,容許範圍是[5,255],一般應該在 5x5 至 21x21 之間,引數必須是奇數,int 型
- minDisparity:最小視差,預設值為 0, 可以是負值,int 型
- numberOfDisparities:視差視窗,即最大視差值與最小視差值之差, 視窗大小必須是 16 的整數倍,int 型
// 後處理引數
- textureThreshold:低紋理區域的判斷閾值。如果當前SAD視窗內所有鄰居畫素點的x導數絕對值之和小於指定閾值,則該視窗對應的畫素點的視差值為 0(That is, if the sum of absolute values of x-derivatives computed over SADWindowSize by SADWindowSize pixel neighborhood is smaller than the parameter, no disparity is computed at the pixel),該引數不能為負值,int 型
- uniquenessRatio:視差唯一性百分比, 視差視窗範圍內最低代價是次低代價的(1 + uniquenessRatio/100)倍時,最低代價對應的視差值才是該畫素點的視差,否則該畫素點的視差為 0 (the minimum margin in percents between the best (minimum) cost function value and the second best value to accept the computed disparity, that is, accept the computed disparity d^ only if SAD(d) >= SAD(d^) x (1 + uniquenessRatio/100.) for any d != d*+/-1 within the search range ),該引數不能為負值,一般5-15左右的值比較合適,int 型
- speckleWindowSize:檢查視差連通區域變化度的視窗大小, 值為 0 時取消 speckle 檢查,int 型
- speckleRange:視差變化閾值,當視窗內視差變化大於閾值時,該視窗內的視差清零,int 型
// OpenCV2.1 新增的狀態引數
- roi1, roi2:左右檢視的有效畫素區域,一般由雙目校正階段的 cvStereoRectify 函式傳遞,也可以自行設定。一旦在狀態引數中設定了 roi1 和 roi2,OpenCV 會通過cvGetValidDisparityROI 函式計算出視差圖的有效區域,在有效區域外的視差值將被清零。
- disp12MaxDiff:左視差圖(直接計算得出)和右視差圖(通過cvValidateDisparity計算得出)之間的最大容許差異。超過該閾值的視差值將被清零。該引數預設為 -1,即不執行左右視差檢查。int 型。注意在程式除錯階段最好保持該值為 -1,以便檢視不同視差視窗生成的視差效果。具體請參見《使用OpenGL動態顯示雙目視覺三維重構效果示例》一文中的討論。
在上述引數中,對視差生成效果影響較大的主要引數是 SADWindowSize、numberOfDisparities 和 uniquenessRatio 三個,一般只需對這三個引數進行調整,其餘引數按預設設定即可。
在OpenCV2.1中,BM演算法有C和C++ 兩種實現模組。
原圖:
BM演算法效果圖:
(2)StereoSGBMState
SGBM演算法的狀態引數大部分與BM演算法的一致,下面只解釋不同的部分:
- SADWindowSize:SAD視窗大小,容許範圍是[1,11],一般應該在 3x3 至 11x11 之間,引數必須是奇數,int 型
- P1, P2:控制視差變化平滑性的引數。P1、P2的值越大,視差越平滑。P1是相鄰畫素點視差增/減 1 時的懲罰係數;P2是相鄰畫素點視差變化值大於1時的懲罰係數。P2必須大於P1。OpenCV2.1提供的例程 stereo_match.cpp 給出了 P1 和 P2 比較合適的數值。
- fullDP:布林值,當設定為 TRUE 時,執行雙通道動態程式設計演算法(full-scale 2-pass dynamic programming algorithm),會佔用O(W*H*numDisparities)個位元組,對於高解析度影象將佔用較大的記憶體空間。一般設定為 FALSE。
注意OpenCV2.1的SGBM演算法是用C++ 語言編寫的,沒有C實現模組。與H. Hirschmuller提出的原演算法相比,主要有如下變化:
- 演算法預設執行單通道DP演算法,只用了5個方向,而fullDP使能時則使用8個方向(可能需要佔用大量記憶體)。
- 演算法在計算匹配代價函式時,採用塊匹配方法而非畫素匹配(不過SADWindowSize=1時就等於畫素匹配了)。
- 增加了一些BM演算法中的預處理和後處理程式。
(3)StereoGCState
GC演算法的狀態引數只有兩個:numberOfDisparities 和 maxIters ,並且只能通過 cvCreateStereoGCState 在建立演算法狀態結構體時一次性確定,不能在迴圈中更新狀態資訊。GC演算法並不是一種實時演算法,但可以得到物體輪廓清晰準確的視差圖,適用於靜態環境物體的深度重構。
注意GC演算法只能在C語言模式下執行,並且不能對視差圖進行預先的邊界延拓,左右檢視和左右視差矩陣的大小必須一致。