双目视觉立体匹配算法
1.雙目立體匹配算法
左右視差
以后再細寫。
1.1 立體匹配的流程
- 攝像機標定(包括內參和外參):直接用matlab標定工具箱即可
- 雙目圖像的校正(包括畸變校正和立體校正):立體校正opencv samples里給了案
- 立體匹配算法獲取視差圖,以及深度圖
- SAD/SGBM/BM/GC/
- 利用視差圖,或者深度圖進行虛擬視點的合成
- 利用分水嶺算法或者Grabcut算法進行分割
1.2 最新的方法
最近已經出現了使用DL做視差預測以及場景流預測的工作了,如:
Pyramid Stereo Matching Network (CVPR2018):
2.SGBM算法
SGBM(semi-global block matching,又稱SGM算法)
參考SGM算法思路
該算法已經在opencv庫中,函數為SGBM;并且在ROS中也有實現,并且為默認方法
SGBM詳細步驟可參考:SGBM解讀
2.1 算法原理
主要分為:
1)預處理 preprocessing:
先運用sobel算子獲得邊緣;
再用一個函數將經過水平Sobel算子處理后的圖像上每個像素點
預處理實際上是得到圖像的梯度信息。
2)代價計算 cost
包括:
- 經過預處理得到的圖像的梯度信息經過基于采樣的方法得到的梯度代價;
- SAD(sum of absolute difference),即左右圖像在一個窗口內對應像素之差的和。
3)動態規劃 dynamic programming
4)后處理 postprocessing
- 唯一性檢測
- 亞像素差值
- 左右一致性檢測
- 連通區域檢測
2.2 opencv4.0調用
如下,其中比較關鍵的參數有:
1)預處理
preFilterCap:水平sobel預處理后,映射濾波器大小,默認為15。
2)代價函數
minDisparity:最小視差,默認為0。此參數決定左圖中的像素點在右圖匹配搜索的起點。
numberOfDisparities:視差搜索范圍,其值必須為16的整數倍。最大搜索邊界= numberOfDisparities+ minDisparity。我通常取64。
SADWindowSize:SAD窗口大小,通常取11。
3)動態規劃
有兩個參數,分別是P1、P2,它們控制視差變化平滑性的參數。
P1、P2的值越大,視差越平滑。P1是相鄰像素點視差增/減 1 時的懲罰系數;P2是相鄰像素點視差變化值大于1時的懲罰系數。P2必須大于P1。需要指出,在動態規劃時,P1和P2都是常數。
在官方例子中,
P1=8cnsgbm.SADWindowSizesgbm.SADWindowSize;
P2=32cnsgbm.SADWindowSizesgbm.SADWindowSize;
4)后處理
uniquenessRatio:唯一性檢測參數。用于判斷當前像素點是否無匹配,取值在5-15之間,通常取10。
disp12MaxDiff:左右一致性檢測最大容許誤差閾值,通常取1。
speckleWindowSize:視差連通區域像素點個數的大小。對于每一個視差點,當其連通區域的像素點個數小于speckleWindowSize時,認為該視差值無效,是噪點。通常取100。
speckleRange:視差連通條件,在計算一個視差點的連通區域時,當下一個像素點視差變化絕對值大于speckleRange就認為下一個視差像素點和當前視差像素點是不連通的。通常取10。
參考:立體匹配
總結:
2.2 UV視差
參考:
U-V視差1
U-V視差2
2.3 Git Repo參考
其實git上一搜一大把,還是貼幾個以供參考,記錄一下。
- SGM-disparity
- SGM(包含GPU版本實現)
- SGM-CPU實現
- 基于CUDA的實現:https://github.com/fixstars/libSGM.git
- 基于ROS與CUDA的實現:https://github.com/hunterlew/stereo_matching
- 基于ROS并生成電云的實現:https://github.com/rachillesf/stereoMagic.git
- Some basical stereo matching methods:https://github.com/galad-loth/StereoMatching.git
參考
總結
以上是生活随笔為你收集整理的双目视觉立体匹配算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十天学会单片机可能吗?单片机入门需要多久
- 下一篇: 汇编符号语言