opencv StereoBM各個參數的意義

另一篇很好的參考博客:https://cloud.tencent.com/developer/article/1065819

from http://blog.csdn.net/chenyusiyuan/article/details/5967291


5. 如何設置BM、SGBM和GC算法的狀態參數?

(1)StereoBMState

// 預處理濾波參數

  • preFilterType:預處理濾波器的類型,主要是用於降低亮度失真(photometric distortions)、消除噪聲和增強紋理等, 有兩種可選類型:CV_STEREO_BM_NORMALIZED_RESPONSE(歸一化響應) 或者 CV_STEREO_BM_XSOBEL(水平方向Sobel算子,默認類型), 該參數爲 int 型;
  • 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++ 兩種實現模塊。

 

(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提出的原算法相比,主要有如下變化:

  1. 算法默認運行單通道DP算法,只用了5個方向,而fullDP使能時則使用8個方向(可能需要佔用大量內存)。
  2. 算法在計算匹配代價函數時,採用塊匹配方法而非像素匹配(不過SADWindowSize=1時就等於像素匹配了)。
  3. 匹配代價的計算採用BT算法(”Depth Discontinuities by Pixel-to-Pixel Stereo” by S. Birchfield and C. Tomasi),並沒有實現基於互熵信息的匹配代價計算。
  4. 增加了一些BM算法中的預處理和後處理程序。

(3)StereoGCState

GC算法的狀態參數只有兩個:numberOfDisparities 和 maxIters ,並且只能通過 cvCreateStereoGCState 在創建算法狀態結構體時一次性確定,不能在循環中更新狀態信息。GC算法並不是一種實時算法,但可以得到物體輪廓清晰準確的視差圖,適用於靜態環境物體的深度重構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章