什么是SGBM
SGBM(Semi-Global Block Matching)是一種用于計算雙目視覺中視差(disparity)的半全局匹配算法,在OpenCV中的實現為semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的優缺點,提出了一種折中的方法,既能保證視差圖的質量,又能降低計算復雜度。
SGBM的原理
SGBM的原理可以分為以下幾個步驟:
預處理:使用水平Sobel算子對左右圖像進行邊緣檢測,得到梯度圖像。
匹配代價計算:對于每個像素,計算其在不同視差下與對應像素的匹配代價,通常使用絕對差或平方差作為代價函數。
能量函數最小化:對于每個像素,定義一個能量函數,包括數據項和平滑項。數據項表示匹配代價,平滑項表示相鄰像素的視差連續性。使用動態規劃的方法,沿著多個方向(通常為8個或16個)計算累積代價,并求取最小值作為最終代價。
視差圖生成:對于每個像素,根據最終代價選擇最佳視差,并生成視差圖。
視差圖后處理:對于視差圖中的異常值或空洞,使用一些后處理方法進行修復或填充,例如中值濾波、WLS濾波等。
SGBM的參數
SGBM的參數有以下幾個:
minDisparity:最小視差值,默認為0。
numDisparities:視差范圍,默認為16。必須是16的整數倍。
blockSize:匹配塊大小,默認為3。必須是奇數且大于1。
P1:控制視差平滑度的第一個參數,默認為8blockSizeblockSize。P1越大,越傾向于生成連續的視差圖。
P2:控制視差平滑度的第二個參數,默認為32blockSizeblockSize。P2越大,越傾向于消除小的視差變化。P2必須大于P1。
disp12MaxDiff:左右一致性檢查時允許的最大視差差異,默認為-1,表示不進行檢查。
preFilterCap:預處理時截斷梯度值的上限,默認為63。
uniquenessRatio:唯一性檢查時的閾值,默認為10。表示最佳視差值與次佳視差值之間的比例要大于該閾值才被認為是有效的。
speckleWindowSize:消除噪聲斑點時考慮的窗口大小,默認為0,表示不進行消除。
speckleRange:消除噪聲斑點時考慮的最大視差變化,默認為0,表示不進行消除。
mode:SGBM算法選擇模式,默認為StereoSGBM::MODE_SGBM。可選值有StereoSGBM::MODE_SGBM_3WAY(速度快)、StereoSGBM::MODE_HH4(速度慢)、StereoSGBM::MODE_SGBM(速度中等)、StereoSGBM::MODE_HH(速度慢)。
SGBM的參數變化
下面通過調整每個參數來觀察其影響效果:初始值設置:
minDisparity=0 numDisparities=16 blockSize=3 P1=8*blockSize*blockSize P2=32*blockSize*blockSize disp12MaxDiff=-1 preFilterCap=63 uniquenessRatio=10 speckleWindowSize=0 speckleRange=0
numDisparities:視差數量越多,能夠獲取到更多詳細的深度信息。但是,增加視差數量也會增加計算量,可能會導致較慢的運行速度以及噪聲增多,且增大numDisparities會擴大視差范圍,即視差圖中可以估計的深度范圍增大。如果增大的視差范圍超過了場景中實際的深度范圍,就會出現黑色區域。黑色區域表示無法進行有效的匹配或估計深度。
minDisparity:最小視差越大,物體離相機近的程度就會變小。如果提高最小視差,則可能會使視差圖被高估,因為物體不可能有大于最小視差的負的視差值。而如果最小視差過低,則可能會受到噪聲的影響,產生錯誤的視差值。
blockSize:所選的窗口大小越大,所包含的像素就越多,從而產生更穩定,但粗略的視差圖。減小塊大小,可以獲得反之,一些銳利但可能嘈雜(即不確定)的視差邊緣。
P1 和 P2:兩種參數都是控制視差變化規則的,從而使結果更平滑,增加這些值會使抗噪聲能力更強但同時會失去保留銳度的細節。如果P1和P2參數值過小,則會使視差圖中出現許多噪聲或未對齊的圖像。如果參數值太高,將導致平滑的結果,丟失更多的細節和銳度。
disp12MaxDiff:這個參數用于限制左右視圖之間的最大視差數量差異。增加這個值可能會導致插值和未對齊的像素點在圖像中顯示。但太小的值,則視差較光滑,缺少細節特征。
uniquenessRatio:這個參數是用來控制像素值的唯一性,如果唯一性比例越高,則得到的視差圖的噪聲和未對齊的像素會越小。但如果唯一性比例太高,則有可能會失去細節特征。
speckleWindowSize:這個參數被用來濾除孤立噪點或者離群值,如果窗口太小,則沒有過濾到足夠的噪聲點而窗口太大則會損失一些細節特征。
speckleRange:這個參數規定一個視差變化的閾值,如果發現視差變化超出了這個閾值,則這個像素應該是一些無用的孤立像素。適當調整該參數可以使其過濾掉孤立的雜點和噪聲。
preFilterCap:該參數控制了像素的最大值。如果已經將值限制在負值的范圍內,那么它必須和像素值相比較,過濾掉那些值過大的像素點。
mode:SGBM算法的解釋模式,分別為SGBM,HHSGBM和SGBM_3WAY。這些模式包含了不同的參數設定,也會影響到視差圖的效果。
SGBM:這是默認的解釋模式,也是最常用的模式。它代表了Semi-Global Block Matching (SGBM) 算法,該算法利用全局視差的一致性來獲得更準確的視差圖。
HHSGBM:這代表了H.Hirschmüller的快速近似SGBM算法(H.Hirschmüller's Hierarchical Semi-Global Block Matching),是一種更快速的算法。它在速度上相對于標準SGBM算法有所優化,但可能在某些情況下會犧牲一些準確性。
SGBM_3WAY:這是一種三通道SGBM算法,它將輸入圖像的三個通道(BGR)分別作為獨立的視差圖像進行處理。然后,將三個視差圖像中的像素最小化,從而得到最終的視差圖。這種方法可以改善處理彩色圖像時的準確性。
—END—
審核編輯:劉清
-
濾波器
+關注
關注
161文章
7833瀏覽量
178244 -
OpenCV
+關注
關注
31文章
635瀏覽量
41373
原文標題:SGBM你不知道的秘密:深入探討SGBM參數影響效果
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論