視差圖演算法
『壹』 雙目視覺的匹配演算法是不是有好幾種具體是哪幾種
與普通的圖像模板匹配不同的是,立體匹配是通過在兩幅或多幅存在視點差異、幾何畸變、灰度畸變、雜訊干擾的圖像對之間進行的,不存在任何標准模板進行匹配。立體匹配方法一般包含以下三個問題:(1)基元的選擇,即選擇適當的圖像特徵如點、直線、相位等作為匹配基元;(2)匹配的准則,將關於物理世界的某些固有特徵表示為匹配所必須遵循的若干規則,使匹配結果能真實反映景物的本來面目;(3)演算法結構,通過利用適當的數學方法設計能正確匹配所選擇基元的穩定演算法。
根據匹配基元的不同,立體視覺匹配演算法目前主要分為三大類,即區域匹配、相位匹配和特徵匹配:
基於區域灰度的匹配演算法是把一幅圖像(基準圖)中某一點的灰度鄰域作為模板,在另一幅圖像(待匹配圖)中搜索具有相同(或相似)灰度值分布的對應點鄰域,從而實現兩幅圖像的匹配。這類演算法的性能取決於度量演算法及搜索策略的選擇。另外,也必須考慮匹配窗口大小、形式的選擇,大窗口對於景物中存在的遮擋或圖像不光滑的情況會更多的出現誤匹配,小窗口則不具有足夠的灰度變化信息,不同的窗口形式對匹配信息也會有不同的影響。因此應該合理選取匹配區域的大小和形式來達到較好的匹配結果。
相位匹配是近二十年發展起來的一種匹配演算法,相位作為匹配基元,即認為圖像對中的對應點局部相位是一致的。最常用的相位匹配演算法有相位相關法和相位差——頻率法,雖然該方法是一種性能穩定、具有較強的抗輻射抗透視畸變能力、簡單高效、能得到稠密視差圖的特徵匹配方法。但是,當局部結構存在的假設不成立時,相位匹配演算法因帶通輸出信號的幅度太低而失去有效性,也就是通常提到的相位奇點問題,在相位奇點附近,相位信息對位置和頻率的變化極為敏感,因此用這些像素所確定的相位差異來衡量匹配誤差將導致極不可靠的結果。此外,相位匹配演算法的收斂范圍與帶通濾波器的波長有關,通常要考慮相位卷繞,在用相位差進行視差計算時,由於所採用的相位只是原信號某一帶通條件下的相位,故視差估計只能限制在某一限定范圍之內,隨視差范圍的增大,其精確性會有所下降。
基於特徵的圖像匹配方法是目前最常用的方法之一,由於它能夠將對整個圖像進行的各種分析轉化為對圖像特徵(特徵點、特徵曲線等)的分析的優點,從而大大減小了圖像處理過程的計算量,對灰度變化、圖像變形、噪音污染以及景物遮擋等都有較好的適應能力。
基於特徵的匹配方法是為使匹配過程滿足一定的抗噪能力且減少歧義性問題而提出來的。與基於區域的匹配方法不同,基於特徵的匹配方法是有選擇地匹配能表示景物自身特性的特徵,通過更多地強調空間景物的結構信息來解決匹配歧義性問題。這類方法將匹配的搜索范圍限制在一系列稀疏的特徵上。利用特徵間的距離作為度量手段,具有最小距離的特徵對就是最相近的特徵對,也就是匹配對。特徵間的距離度量有最大最小距離、歐氏距離等。
特徵點匹配演算法嚴格意義上可以分成特徵提取、特徵匹配和消除不良匹配點三步。特徵匹配不直接依賴於灰度,具有較強的抗干擾性。該類方法首先從待匹配的圖像中提取特徵,用相似性度量和一些約束條件確定幾何變換,最後將該變換作用於待匹配圖像。匹配中常用的特徵基元有角點、邊緣、輪廓、直線、顏色、紋理等。同時,特徵匹配演算法也同樣地存在著一些不足,主要表現為:
(l)特徵在圖像中的稀疏性決定了特徵匹配只能得到稀疏的視差場,要獲得密集的視差場必須通過使用插值的過程,插值過程通常較為復雜。
(2)特徵的提取和定位的准確與否直接影響特徵匹配結果的精確度。
(3)由於其應用場合的局限性,特徵匹配往往適用於具有特徵信息顯著的環境中,在缺少顯著主導特徵環境中該方法有很大困難。
總之,特徵匹配基元包含了演算法編程上的靈活性以及令人滿意的統計特性。演算法的許多約束條件均能清楚地應用於數據結構,而數據結構的規則性使得特徵匹配非常適用於硬體設計。例如,基於線段的特徵匹配演算法將場景模型描繪成相互聯結的邊緣線段,而不是區域匹配中的平面模型,因此能很好地處理一些幾何畸變問題,對對比度和明顯的光照變化等相對穩定。特徵匹配由於不直接依賴於灰度,計算量小,比基於區域的匹配演算法速度快的多。且由於邊緣特徵往往出現在視差不連續的區域,特徵匹配較易處理立體視覺匹配中的視差不連續問題。
『貳』 雙目立體視覺的簡單介紹
雙目立體視覺的簡單介紹
1. 什麼是視覺
視覺是一個古老的研究課題,同時又是人類觀察世界、認知世界的重要功能和手段。人類從外界獲得的信息約有75%來自視覺系統,用機器模擬人類的視覺功能是人們多年的夢想。視覺神經生理學,視覺心裡學,特別是計算機技術、數字圖像處理、計算機圖形學、人工智慧等學科的發展,為利用計算機實現模擬人類的視覺成為可能。在現代工業自動化生產過程中,計算機視覺正成為一種提高生產效率和檢驗產品質量的關鍵技術之一,如機器零件的自動檢測、智能機器人控制、生產線的自動監控等;在國防和航天等領域,計算機視覺也具有較重要的意義,如運動目標的自動跟蹤與識別、自主車導航及空間機器人的視覺控制等。
人類視覺過程可以看作是一個從感覺到知覺的復雜過程,從狹義上來說視覺的最終目的是要對場景作出對觀察者有意義的解釋和描述;從廣義上說,是根據周圍的環境和觀察者的意願,在解釋和描述的基礎上做出行為規劃或行為決策。計算機視覺研究的目的使計算機具有通過二維圖像信息來認知三維環境信息的能力,這種能力不僅使機器能感知三維環境中物體的幾何信息(如形狀、位置、姿態運動等),而且能進一步對它們進行描述、存儲、識別與理解,計算機視覺己經發展起一套獨立的計算理論與演算法。
2. 什麼是計算機雙目立體視覺
雙目立體視覺 (Binocular StereoVision)是機器視覺的一種重要形式,它是基於視差原理並利用成像設備從不同的位置獲取被測物體的兩幅圖像,通過計算圖像對應點間的位置偏差,來獲取物體三維幾何信息的方法。融合兩隻眼睛獲得的圖像並觀察它們之間的差別,使我們可以獲得明顯的深度感,建立特徵間的對應關系,將同一空間物理點在不同圖像中的映像點對應起來,這個差別,我們稱作視差(Disparity)圖像,如圖一。
雙目立體視覺 測量方法具有效率高、精度合適、系統結構簡單、成本低等優點,非常適合於製造現場的在線、非接觸產品檢測和質量控制。對運動物體(包括動物和人體形體)測量中,由於圖像獲取是在瞬間完成的,因此立體視覺方法是一種更有效的測量方法。
雙目立體視覺 系統是計算機視覺的關鍵技術之一,獲取空間三維場景的距離信息也是計算機視覺研究中最基礎的內容。
雙目立體視覺 的開創性工作始於上世紀的60年代中期。美國MIT的Roberts通過從數字圖像中提取立方體、楔形體和稜柱體等簡單規則多面體的三維結構,並對物體的形狀和空間關系進行描述,把過去的簡單二維圖像分析推廣到了復雜的三維場景,標志著立體視覺技術的誕生。隨著研究的深入,研究的范圍從邊緣、角點等特徵的提取,線條、平面、曲面等幾何要素的分析,直到對圖像明暗、紋理、運動和成像幾何等進行分析,並建立起各種數據結構和推理規則。特別是上世紀80年代初,Marr首次將圖像處理、心理物理學、神經生理學和臨床精神病學的研究成果從信息處理的角度進行概括,創立了視覺計算理論框架。這一基本理論對立體視覺技術的發展產生了極大的推動作用,在這一領域已形成了從圖像的獲取到最終的三維場景可視表面重構的完整體系,使得立體視覺已成為計算機視覺中一個非常重要的分支。
經過幾十年來的發展,立體視覺在機器人視覺、航空測繪、反求工程、軍事運用、醫學成像和工業檢測等領域中的運用越來越廣。
3. 雙目立體視覺系統
立體視覺系統由左右兩部攝像機組成。如圖二所示,圖中分別以下標l和r標注左、右攝像機的相應參數。世界空間中一點A(X,Y,Z)在左右攝像機的成像面Cl和Cr上的像點分別為al(ul,vl)和ar(ur,vr)。這兩個像點是世界空間中同一個對象點A的像,稱為「共軛點」。知道了這兩個共軛像點,分別作它們與各自相機的光心Ol和Or的連線,即投影線alOl和arOr,它們的交點即為世界空間中的對象點A(X,Y,Z)。這就是立體視覺的基本原理。
4. 博安盈雙目立體視覺系統:平行光軸的系統結構
在平行光軸的立體視覺系統中(圖三),左右兩台攝像機的焦距及其它內部參數均相等,光軸與攝像機的成像平面垂直,兩台攝像機的x軸重合,y軸相互平行,因此將左攝像機沿著其x軸方向平移一段距離b(稱為基線baseline)後與右攝像機重合。
由空間點A及左右兩攝像機的光心Ol、Or確定的極平面(Epipolar plane)分別與左右成像平面Cl、Cr的交線pl、pr為共軛極線對,它們分別與各自成像平面的坐標軸ul、ur平行且共線。在這種理想的結構形式中,左右攝像機配置的幾何關系最為簡單,極線已具有很好的性質,為尋找對象點A在左右成像平面上的投影點al和ar之間的匹配關系提供了非常便利的條件。
5. 雙目立體視覺智能視頻分析技術
恢復場景的3D信息是立體視覺研究中最基本的目標,為實現這一目標,一個完整的立體視覺系統通常包含六個模塊:圖像獲取、攝像機標定、特徵提取、立體匹配、三維恢復和視頻分析(運動檢測、運動跟蹤、規則判斷、報警處理)。
5.1. 圖像獲取(ImageAcquisition)
數字圖像的獲取是立體視覺的信息來源。常用的立體視覺圖像一般為雙目圖像,有的採用多目圖像。圖像獲取的方式有多種,主要由具體運用的場合和目的決定。立體圖像的獲取不僅要滿足應用要求,而且要考慮視點差異、光照條件、攝像機性能和場景特點等方面的影響。
5.2. 攝像機標定(CameraCalibration)
立體視覺系統攝像機標定是指對三維場景中對象點在左右攝像機圖像平面上的坐標位置al(ul,vl)、ar(ur,vr)與其世界空間坐標A(X,Y,Z)之間的映射關系的確立,是實現立體視覺三維模型重構中基本且關鍵的一步。
5.3. 特徵提取(FeatureAcquisition)
特徵提取的目的是要獲取匹配賴以進行的圖像特徵,圖像特徵的性質與圖像匹配的方法選擇有著密切的聯系。目前,還沒有建立起一種普遍適用的獲取圖像特徵的理論,因此導致了立體視覺研究領域中匹配特徵的多樣化。特徵可以是像素相位匹配是近二十年才發展起來的一類匹配演算法。相位作為匹配基元,本身反映信號的結構信息,對圖像的高頻雜訊有很好的抑製作用,適於並行處理,能獲得亞像素級精度的緻密視差。但存在相位奇點和相位卷繞的問題,需加入自適應濾波器解決。或者是像素的集合,也可以是它們的抽象表達,如圖像結構、圖像目標和關系結構等。常用的匹配特徵主要有點狀特徵、線狀特徵和區域特徵等幾種情形。
一般而言,尺度較大的圖像特徵蘊含較多的圖像信息,且特徵本身的數目較少,匹配效率高;但特徵的提取和描述過程存在較大的困難,定位精度也較差。而對於尺度較小的圖像特徵來說,對其進行表達和描述相對簡單,定位精度較高;但由於其本身數目較多,所包含的圖像信息少,在匹配時需要採用較嚴格的約束條件和匹配策略,以盡可能地減少匹配歧義和提高匹配效率。總的來說,好的匹配特徵應該具有要可區分性、不變性、唯一性以及有效解決匹配歧義的能力。
5.4. 圖像匹配(ImageMatching)
在立體視覺中(圖二、圖三),圖像匹配是指將三維空間中一點A(X,Y,Z)在左右攝像機的成像面Cl和Cr上的像點al(ul,vl)和ar(ur,vr)對應起來。圖像匹配是立體視覺中最重要也是最困難的問題,一直是立體視覺研究的焦點。當空間三維場景經過透視投影(PerspectiveProjection)變換為二維圖像時,同一景物在不同視點的攝像機圖像平面上的成像會發生不同程度的扭曲和變形,而且場景中的光照條件、被測對象的幾何形狀和表面特性、雜訊干擾和畸變、攝像機特性等諸多因素的影響都被集中體現在單一的圖像灰度值中。顯然,要對包含了如此之多不利因素的圖像進行准確匹配是很不容易的。
5.5. 三維恢復(3DReconstruction)
在完成立體視覺系統的攝像機標定和圖像匹配工作以後,就可以進行被測對象表面點的三維信息恢復。影響三維測量精度的因素主要有攝像機標定誤差、CCD成像設備的數字量化效應、特徵提取和匹配定位精度等。
5.6. 視頻分析(運動檢測、運動跟蹤、規則判斷、報警處理)
通過視差計算,得到全屏幕的視差圖像後,採用背景建模的方式,得到運動前景物體的視差圖像,再進行膨脹和腐蝕演算法進行圖像預處理,得到完整的可供分析的前景運動物體視差圖。採用運動跟蹤演算法,全屏實時檢測物體的大小、運動軌跡,並與事先設置的規則進行對比,如果有人進入或離開設置報警區域,系統則實時報警。
5.7. 視差效果圖:
註:過濾掉距離地面60cm以內,200cm以上的視差值,即檢測范圍為60-200cm之間。故左邊蹲下的人沒有視差值。
『叄』 雙目立體視覺中,得到視差點後怎樣得出視差圖得到深度信息後怎樣獲得深度圖
雙目攝像頭是怎麼放的,視差可以直接得出,深度計算有推導的公式計算,不過還需要攝像機的一些參數
『肆』 matlab雙目測距中怎樣把攝像機標定後的內外參數和視差圖結合起來計算深度距離
你用的是雙面立體相機配置嗎?如果是,你需要標定左右兩個相機的內部參數,即焦距,像素物理尺寸,還有兩個相機間的三維平移,旋轉量。如果你不做三維重建的話,就不需要得到外部參數。得到相機內部參數,就可以矯正左右兩幅圖像對,然後使用立體匹配演算法得到目標的視差圖像,然後用你得到的,fc,cc參數,用三角法則計算出目標點到相機平面的距離。三角法則:z=f*b/d。f是焦距,b是兩相機間的橫向距離,d是立體匹配得到的視差值,即目標像素點在左右兩相機平面x方向的坐標差值。
『伍』 opencv三維重建深度怎麼不隨視場變化
四、雙目匹配與視差計算
立體匹配主要是通過找出每對圖像間的對應關系,根據三角測量原理,得到視差圖;在獲得了視差信息後,根據投影模型很容易地可以得到原始圖像的深度信息和三維信息。立體匹配技術被普遍認為是立體視覺中最困難也是最關鍵的問題,主要是以下因素的影響:
(1) 光學失真和雜訊(亮度、色調、飽和度等失衡)
(2) 平滑表面的鏡面反射
(3) 投影縮減(Foreshortening)
(4) 透視失真(Perspective distortions)
(5) 低紋理(Low texture)
(6) 重復紋理(Repetitive/ambiguous patterns)
(7) 透明物體
(8) 重疊和非連續
目前立體匹配演算法是計算機視覺中的一個難點和熱點,演算法很多,但是一般的步驟是:
A、匹配代價計算
匹配代價計算是整個立體匹配演算法的基礎,實際是對不同視差下進行灰度相似性測量。常見的方法有灰度差的平方SD(squared intensity differences),灰度差的絕對值AD(absolute intensity differences)等。另外,在求原始匹配代價時可以設定一個上限值,來減弱疊加過程中的誤匹配的影響。以AD法求匹配代價為例,可用下式進行計算,其中T為設定的閾值。
圖18
B、 匹配代價疊加
一般來說,全局演算法基於原始匹配代價進行後續演算法計算。而區域演算法則需要通過窗口疊加來增強匹配代價的可靠性,根據原始匹配代價不同,可分為:
圖19
C、 視差獲取
對於區域演算法來說,在完成匹配代價的疊加以後,視差的獲取就很容易了,只需在一定范圍內選取疊加匹配代價最優的點(SAD和SSD取最小值,NCC取最大值)作為對應匹配點,如勝者為王演算法WTA(Winner-take-all)。而全局演算法則直接對原始匹配代價進行處理,一般會先給出一個能量評價函數,然後通過不同的優化演算法來求得能量的最小值,同時每個點的視差值也就計算出來了。
D、視差細化(亞像素級)
大多數立體匹配演算法計算出來的視差都是一些離散的特定整數值,可滿足一般應用的精度要求。但在一些精度要求比較高的場合,如精確的三維重構中,就需要在初始視差獲取後採用一些措施對視差進行細化,如匹配代價的曲線擬合、圖像濾波、圖像分割等。
有關立體匹配的介紹和常見匹配演算法的比較,推薦大家看看Stefano Mattoccia 的講義 Stereo Vision: algorithms and applications,190頁的ppt,講解得非常形象詳盡。
1. opencv2.1和opencv2.0在做stereo vision方面有什麼區別了?
2.1版增強了Stereo Vision方面的功能:
(1) 新增了 SGBM 立體匹配演算法(源自Heiko Hirschmuller的《Stereo Processing by Semi-global Matching and Mutual Information》),可以獲得比 BM 演算法物體輪廓更清晰的視差圖(但低紋理區域容易出現橫/斜紋路,在 GCstate->fullDP 選項使能時可消減這種異常紋路,但對應區域視差變為0,且運行速度會有所下降),速度比 BM 稍慢, 352*288的幀處理速度大約是 5 幀/秒;
(2) 視差效果:BM < SGBM < GC;處理速度:BM > SGBM > GC ;
(3) BM 演算法比2.0版性能有所提升,其狀態參數新增了對左右視圖感興趣區域 ROI 的支持(roi1 和 roi2,由stereoRectify函數產生);
(4) BM 演算法和 GC 演算法的核心代碼改動不大,主要是面向多線程運算方面的(由 OpenMP 轉向 Intel TBB);
(5) cvFindStereoCorrespondenceBM 函數的disparity參數的數據格式新增了 CV_32F 的支持,這種格式的數據給出實際視差,而 2.0 版只支持 CV_16S,需要除以 16.0 才能得到實際的視差數值。
2. 用於立體匹配的圖像可以是彩色的嗎?
在OpenCV2.1中,BM和GC演算法只能對8位灰度圖像計算視差,SGBM演算法則可以處理24位(8bits*3)彩色圖像。所以在讀入圖像時,應該根據採用的演算法來處理圖像:
int color_mode = alg == STEREO_SGBM ? 1 : 0;
//////////////////////////////////////////////////////////////////////////
// 載入圖像
cvGrabFrame( lfCam );
cvGrabFrame( riCam );
frame1 = cvRetrieveFrame( lfCam );
frame2 = cvRetrieveFrame( riCam );
if(frame1.empty()) break;
resize(frame1, img1, img_size, 0, 0);
resize(frame2, img2, img_size, 0, 0);
// 選擇彩色或灰度格式作為雙目匹配的處理圖像
if (!color_mode && cn>1)
{
cvtColor(img1, img1gray, CV_BGR2GRAY);
cvtColor(img2, img2gray, CV_BGR2GRAY);
img1p = img1gray;
img2p = img2gray;
}
else
{
img1p = img1;
img2p = img2;
}
3. 怎樣獲取與原圖像有效像素區域相同的視差圖?
在OpenCV2.0及以前的版本中,所獲取的視差圖總是在左側和右側有明顯的黑色區域,這些區域沒有有效的視差數據。視差圖有效像素區域與視差窗口(ndisp,一般取正值且能被16整除)和最小視差值(mindisp,一般取0或負值)相關,視差窗口越大,視差圖左側的黑色區域越大,最小視差值越小,視差圖右側的黑色區域越大。其原因是為了保證參考圖像(一般是左視圖)的像素點能在目標圖像(右視圖)中按照設定的視差匹配窗口匹配對應點,OpenCV 只從參考圖像的第 (ndisp - 1 + mindisp) 列開始向右計算視差,第 0 列到第 (ndisp - 1 + mindisp) 列的區域視差統一設置為 (mindisp - 1) *16;視差計算到第 width + mindisp 列時停止,餘下的右側區域視差值也統一設置為 (mindisp - 1) *16。
00177 static const int DISPARITY_SHIFT = 4;
…
00411 int ndisp = state->numberOfDisparities;
00412 int mindisp = state->minDisparity;
00413 int lofs = MAX(ndisp - 1 + mindisp, 0);
00414 int rofs = -MIN(ndisp - 1 + mindisp, 0);
00415 int width = left->cols, height = left->rows;
00416 int width1 = width - rofs - ndisp + 1;
…
00420 short FILTERED = (short)((mindisp - 1) << DISPARITY_SHIFT);
…
00466 // initialize the left and right borders of the disparity map
00467 for( y = 0; y < height; y++ )
00468 {
00469 for( x = 0; x < lofs; x++ )
00470 dptr[y*dstep + x] = FILTERED;
00471 for( x = lofs + width1; x < width; x++ )
00472 dptr[y*dstep + x] = FILTERED;
00473 }
00474 dptr += lofs;
00475
00476 for( x = 0; x < width1; x++, dptr++ )
…
這樣的設置很明顯是不符合實際應用的需求的,它相當於把攝像頭的視場范圍縮窄了。因此,OpenCV2.1 做了明顯的改進,不再要求左右視圖和視差圖的大小(size)一致,允許對視差圖進行左右邊界延拓,這樣,雖然計算視差時還是按上面的代碼思路來處理左右邊界,但是視差圖的邊界得到延拓後,有效視差的范圍就能夠與對應視圖完全對應。具體的實現代碼範例如下:
//////////////////////////////////////////////////////////////////////////
// 對左右視圖的左邊進行邊界延拓,以獲取與原始視圖相同大小的有效視差區域
MakeBorder(img1r, img1b, 0, 0, m_nMaxDisp, 0, IPL_BORDER_REPLICATE);
MakeBorder(img2r, img2b, 0, 0, m_nMaxDisp, 0, IPL_BORDER_REPLICATE);
//////////////////////////////////////////////////////////////////////////
// 計算視差
if( alg == STEREO_BM )
{
bm(img1b, img2b, dispb);
// 截取與原始畫面對應的視差區域(捨去加寬的部分)
displf = dispb.colRange(m_nMaxDisp, img1b.cols);
}
else if(alg == STEREO_SGBM)
{
sgbm(img1b, img2b, dispb);
displf = dispb.colRange(m_nMaxDisp, img1b.cols);
}
4. cvFindStereoCorrespondenceBM的輸出結果好像不是以像素點為單位的視差?
「@scyscyao:在OpenCV2.0中,BM函數得出的結果是以16位符號數的形式的存儲的,出於精度需要,所有的視差在輸出時都擴大了16倍(2^4)。其具體代碼表示如下:
dptr[y*dstep] = (short)(((ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*128/d : 0) + 15) >> 4);
可以看到,原始視差在左移8位(256)並且加上一個修正值之後又右移了4位,最終的結果就是左移4位。
因此,在實際求距離時,cvReprojectTo3D出來的X/W,Y/W,Z/W都要乘以16 (也就是W除以16),才能得到正確的三維坐標信息。」
在OpenCV2.1中,BM演算法可以用 CV_16S 或者 CV_32F 的方式輸出視差數據,使用32位float格式可以得到真實的視差值,而CV_16S 格式得到的視差矩陣則需要 除以16 才能得到正確的視差。另外,OpenCV2.1另外兩種立體匹配演算法 SGBM 和 GC 只支持 CV_16S 格式的 disparity 矩陣。
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提出的原演算法相比,主要有如下變化:
演算法默認運行單通道DP演算法,只用了5個方向,而fullDP使能時則使用8個方向(可能需要佔用大量內存)。
演算法在計算匹配代價函數時,採用塊匹配方法而非像素匹配(不過SADWindowSize=1時就等於像素匹配了)。
匹配代價的計算採用BT演算法("Depth Discontinuities by Pixel-to-Pixel Stereo" by S. Birchfield and C. Tomasi),並沒有實現基於互熵信息的匹配代價計算。
增加了一些BM演算法中的預處理和後處理程序。