SGBM你不知道的秘密:深入探討SGBM參數(shù)影響效果
SGBM(Semi-Global Block Matching)是一種用于計(jì)算雙目視覺(jué)中視差(disparity)的半全局匹配算法,在OpenCV中的實(shí)現(xiàn)為semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的優(yōu)缺點(diǎn),提出了一種折中的方法,既能保證視差圖的質(zhì)量,又能降低計(jì)算復(fù)雜度。
作者:小張Tt | 來(lái)源:3DCV
添加微信:CV3d007, 備注:立體匹配, 拉你入群。文末附行業(yè)細(xì)分交流群。
SGBM的原理可以分為以下幾個(gè)步驟:
預(yù)處理:使用水平Sobel算子對(duì)左右圖像進(jìn)行邊緣檢測(cè),得到梯度圖像。
匹配代價(jià)計(jì)算:對(duì)于每個(gè)像素,計(jì)算其在不同視差下與對(duì)應(yīng)像素的匹配代價(jià),通常使用絕對(duì)差或平方差作為代價(jià)函數(shù)。
能量函數(shù)最小化:對(duì)于每個(gè)像素,定義一個(gè)能量函數(shù),包括數(shù)據(jù)項(xiàng)和平滑項(xiàng)。數(shù)據(jù)項(xiàng)表示匹配代價(jià),平滑項(xiàng)表示相鄰像素的視差連續(xù)性。使用動(dòng)態(tài)規(guī)劃的方法,沿著多個(gè)方向(通常為8個(gè)或16個(gè))計(jì)算累積代價(jià),并求取最小值作為最終代價(jià)。
視差圖生成:對(duì)于每個(gè)像素,根據(jù)最終代價(jià)選擇最佳視差,并生成視差圖。
視差圖后處理:對(duì)于視差圖中的異常值或空洞,使用一些后處理方法進(jìn)行修復(fù)或填充,例如中值濾波、WLS濾波等。
SGBM的參數(shù)有以下幾個(gè):
minDisparity:最小視差值,默認(rèn)為0。
numDisparities:視差范圍,默認(rèn)為16。必須是16的整數(shù)倍。
blockSize:匹配塊大小,默認(rèn)為3。必須是奇數(shù)且大于1。
P1:控制視差平滑度的第一個(gè)參數(shù),默認(rèn)為8blockSize。P1越大,越傾向于生成連續(xù)的視差圖。
P2:控制視差平滑度的第二個(gè)參數(shù),默認(rèn)為32blockSize。P2越大,越傾向于消除小的視差變化。P2必須大于P1。
disp12MaxDiff:左右一致性檢查時(shí)允許的最大視差差異,默認(rèn)為-1,表示不進(jìn)行檢查。
preFilterCap:預(yù)處理時(shí)截?cái)嗵荻戎档纳舷蓿J(rèn)為63。
uniquenessRatio:唯一性檢查時(shí)的閾值,默認(rèn)為10。表示最佳視差值與次佳視差值之間的比例要大于該閾值才被認(rèn)為是有效的。
speckleWindowSize:消除噪聲斑點(diǎn)時(shí)考慮的窗口大小,默認(rèn)為0,表示不進(jìn)行消除。
speckleRange:消除噪聲斑點(diǎn)時(shí)考慮的最大視差變化,默認(rèn)為0,表示不進(jìn)行消除。
mode:SGBM算法選擇模式,默認(rèn)為StereoSGBM::MODE_SGBM??蛇x值有StereoSGBM::MODE_SGBM_3WAY(速度快)、StereoSGBM::MODE_HH4(速度慢)、StereoSGBM::MODE_SGBM(速度中等)、StereoSGBM::MODE_HH(速度慢)。
下面通過(guò)調(diào)整每個(gè)參數(shù)來(lái)觀察其影響效果:初始值設(shè)置:
minDisparity?=?0numDisparities?=?16blockSize?=?3P1?=?8*blockSize*blockSizeP2?=?32*blockSize*blockSizedisp12MaxDiff?=?-1preFilterCap?=?63uniquenessRatio?=?10speckleWindowSize?=?0speckleRange?=?0
numDisparities:視差數(shù)量越多,能夠獲取到更多詳細(xì)的深度信息。但是,增加視差數(shù)量也會(huì)增加計(jì)算量,可能會(huì)導(dǎo)致較慢的運(yùn)行速度以及噪聲增多,且增大numDisparities會(huì)擴(kuò)大視差范圍,即視差圖中可以估計(jì)的深度范圍增大。如果增大的視差范圍超過(guò)了場(chǎng)景中實(shí)際的深度范圍,就會(huì)出現(xiàn)黑色區(qū)域。黑色區(qū)域表示無(wú)法進(jìn)行有效的匹配或估計(jì)深度。
minDisparity:最小視差越大,物體離相機(jī)近的程度就會(huì)變小。如果提高最小視差,則可能會(huì)使視差圖被高估,因?yàn)槲矬w不可能有大于最小視差的負(fù)的視差值。而如果最小視差過(guò)低,則可能會(huì)受到噪聲的影響,產(chǎn)生錯(cuò)誤的視差值。
blockSize:所選的窗口大小越大,所包含的像素就越多,從而產(chǎn)生更穩(wěn)定,但粗略的視差圖。減小塊大小,可以獲得反之,一些銳利但可能嘈雜(即不確定)的視差邊緣。
P1 和 P2:兩種參數(shù)都是控制視差變化規(guī)則的,從而使結(jié)果更平滑,增加這些值會(huì)使抗噪聲能力更強(qiáng)但同時(shí)會(huì)失去保留銳度的細(xì)節(jié)。如果P1和P2參數(shù)值過(guò)小,則會(huì)使視差圖中出現(xiàn)許多噪聲或未對(duì)齊的圖像。如果參數(shù)值太高,將導(dǎo)致平滑的結(jié)果,丟失更多的細(xì)節(jié)和銳度。
disp12MaxDiff:這個(gè)參數(shù)用于限制左右視圖之間的最大視差數(shù)量差異。增加這個(gè)值可能會(huì)導(dǎo)致插值和未對(duì)齊的像素點(diǎn)在圖像中顯示。但太小的值,則視差較光滑,缺少細(xì)節(jié)特征。
uniquenessRatio:這個(gè)參數(shù)是用來(lái)控制像素值的唯一性,如果唯一性比例越高,則得到的視差圖的噪聲和未對(duì)齊的像素會(huì)越小。但如果唯一性比例太高,則有可能會(huì)失去細(xì)節(jié)特征。
speckleWindowSize:這個(gè)參數(shù)被用來(lái)濾除孤立噪點(diǎn)或者離群值,如果窗口太小,則沒(méi)有過(guò)濾到足夠的噪聲點(diǎn)而窗口太大則會(huì)損失一些細(xì)節(jié)特征。
speckleRange:這個(gè)參數(shù)規(guī)定一個(gè)視差變化的閾值,如果發(fā)現(xiàn)視差變化超出了這個(gè)閾值,則這個(gè)像素應(yīng)該是一些無(wú)用的孤立像素。適當(dāng)調(diào)整該參數(shù)可以使其過(guò)濾掉孤立的雜點(diǎn)和噪聲。
preFilterCap:該參數(shù)控制了像素的最大值。如果已經(jīng)將值限制在負(fù)值的范圍內(nèi),那么它必須和像素值相比較,過(guò)濾掉那些值過(guò)大的像素點(diǎn)。
mode:SGBM算法的解釋模式,分別為SGBM,HHSGBM和SGBM_3WAY。這些模式包含了不同的參數(shù)設(shè)定,也會(huì)影響到視差圖的效果。
SGBM:這是默認(rèn)的解釋模式,也是最常用的模式。它代表了Semi-Global Block Matching (SGBM) 算法,該算法利用全局視差的一致性來(lái)獲得更準(zhǔn)確的視差圖。
HHSGBM:這代表了H.Hirschmüller的快速近似SGBM算法(H.Hirschmüller's Hierarchical Semi-Global Block Matching),是一種更快速的算法。它在速度上相對(duì)于標(biāo)準(zhǔn)SGBM算法有所優(yōu)化,但可能在某些情況下會(huì)犧牲一些準(zhǔn)確性。
SGBM_3WAY:這是一種三通道SGBM算法,它將輸入圖像的三個(gè)通道(BGR)分別作為獨(dú)立的視差圖像進(jìn)行處理。然后,將三個(gè)視差圖像中的像素最小化,從而得到最終的視差圖。這種方法可以改善處理彩色圖像時(shí)的準(zhǔn)確性。
目前工坊已經(jīng)建立了3D視覺(jué)方向多個(gè)社群,包括SLAM、工業(yè)3D視覺(jué)、自動(dòng)駕駛方向,細(xì)分群包括:[工業(yè)方向]三維點(diǎn)云、結(jié)構(gòu)光、機(jī)械臂、缺陷檢測(cè)、三維測(cè)量、TOF、相機(jī)標(biāo)定、綜合群;[SLAM方向]多傳感器融合、ORB-SLAM、激光SLAM、機(jī)器人導(dǎo)航、RTK|GPS|UWB等傳感器交流群、SLAM綜合討論群;[自動(dòng)駕駛方向]深度估計(jì)、Transformer、毫米波|激光雷達(dá)|視覺(jué)攝像頭傳感器討論群、多傳感器標(biāo)定、自動(dòng)駕駛綜合群等。[三維重建方向]NeRF、colmap、OpenMVS等。除了這些,還有求職、硬件選型、視覺(jué)產(chǎn)品落地等交流群。大家可以添加小助理微信: CV3d007,備注:加群+方向+學(xué)校|公司, 小助理會(huì)拉你入群。
如果大家對(duì)3D視覺(jué)某一個(gè)細(xì)分方向想系統(tǒng)學(xué)習(xí)[從理論、代碼到實(shí)戰(zhàn)],推薦3D視覺(jué)精品課程學(xué)習(xí)網(wǎng)址:www.3dcver.com
基礎(chǔ)課程:
[1]面向三維視覺(jué)算法的C++重要模塊精講:從零基礎(chǔ)入門(mén)到進(jìn)階
[2]如何學(xué)習(xí)相機(jī)模型與標(biāo)定?(代碼+實(shí)戰(zhàn))
[3]ROS2從入門(mén)到精通:理論與實(shí)戰(zhàn)
工業(yè)3D視覺(jué)方向課程:
[1]機(jī)械臂抓取從入門(mén)到實(shí)戰(zhàn)課程(理論+源碼)
[2]從零搭建一套結(jié)構(gòu)光3D重建系統(tǒng)[理論+源碼+實(shí)踐]
[3]三維點(diǎn)云處理:算法與實(shí)戰(zhàn)匯總
[4]徹底搞懂基于Open3D的點(diǎn)云處理教程!
[5]3D視覺(jué)缺陷檢測(cè)教程:理論與實(shí)戰(zhàn)!
SLAM方向課程:
[1]如何高效學(xué)習(xí)基于LeGo-LOAM框架的激光SLAM?
[1]徹底剖析激光-視覺(jué)-IMU-GPS融合SLAM算法:理論推導(dǎo)、代碼講解和實(shí)戰(zhàn)
[2](第二期)徹底搞懂基于LOAM框架的3D激光SLAM:源碼剖析到算法優(yōu)化
[3]徹底搞懂視覺(jué)-慣性SLAM:VINS-Fusion原理精講與源碼剖析
[4]徹底剖析室內(nèi)、室外激光SLAM關(guān)鍵算法和實(shí)戰(zhàn)(cartographer+LOAM+LIO-SAM)
[5]ORB-SLAM3理論講解與代碼精析(第2期)
視覺(jué)三維重建
[1]徹底搞透視覺(jué)三維重建:原理剖析、代碼講解、及優(yōu)化改進(jìn))
自動(dòng)駕駛方向課程:
[1]目標(biāo)檢測(cè)中的視覺(jué)Transformer
[2]單目深度估計(jì)方法:算法梳理與代碼實(shí)現(xiàn)
[3]面向自動(dòng)駕駛領(lǐng)域的3D點(diǎn)云目標(biāo)檢測(cè)全棧學(xué)習(xí)路線!(單模態(tài)+多模態(tài)/數(shù)據(jù)+代碼)
[4]如何將深度學(xué)習(xí)模型部署到實(shí)際工程中?(分類(lèi)+檢測(cè)+分割)