講述在10月到12月所做的所有工作
對于一個無人機自主避障來說,存在著以下流程:
感知:障礙物檢測、行人檢測、目標檢測
SLAM:為無人機提供位置估計,構建稀疏環境地圖
路徑規劃:規劃一條從當前位置到目標位置的移動軌跡
控制:控制無人機速度,加速度,追隨規劃出來的軌跡
我先做出了障礙物檢測部分:
Opencv/MATLAB做雙目測距(相機標定+立體匹配+測距)
雙目測距實際操作分4個步驟:相機標定——雙目校正——雙目匹配——計算深度信息。
01
—
相機標定+雙目校正
首先是對攝像頭做標定
Q1:為什么要做相機標定?
標定的目的是為了消除畸變以及得到內外參數矩陣,內參數矩陣可以理解為焦距相關,它是一個從平面到像素的轉換,焦距不變它就不變,所以確定以后就可以重復使用,而外參數矩陣反映的是攝像機坐標系與世界坐標系的轉換,至于畸變參數,一般也包含在內參數矩陣中。從作用上來看,內參數矩陣是為了得到鏡頭的信息,并消除畸變,使得到的圖像更為準確,外參數矩陣是為了得到相機相對于世界坐標的聯系,是為了最終的測距。
無論是在圖像測量或者機器視覺應用中,相機參數的標定都是非常關鍵的環節,其標定結果的精度及算法的穩定性直接影響相機工作產生結果的準確性。因此,做好相機標定是做好后續工作的前提,提高標定精度是科研工作的重點所在。
https://blog.csdn.net/baidu_38172402/article/details/81949447
CSDN
https://www.zhihu.com/question/29448299/answer/102658379
知乎 陳明猷 ?
先完成單目標定,再完成雙目標定。選擇標定方法的時候,選用張正友標定法,因為MATLAB用的也是張正友標定法做的,誤差最小。
雙目標定,必須是拿自己打印的棋盤格擺拍的,且記下棋盤距離自己的距離,以衡量你標定和匹配的誤差是否在合適的范圍之內。
先固定好左右相機,拿棋盤標定圖擺拍并保存,左右相機各15張(我做的時候在30張圖中選用15張圖進行opencv標定的時候誤差最小,但是在MATLAB中就不用考慮這個問題)
------相機標定的代碼網上很多,一步一步來即可---------
簡單來說就是:OpenCV使用黑白棋盤格來標定攝像機,調用findChessboardCorners()獲得棋盤格角點的像素坐標,再調用cornerSubpix獲得棋盤格角點的亞像素坐標。調用drawChessboardCorners()函數繪制出檢測到的棋盤角點,然后使用stereoCalibrate()函數完成雙目標定。
標定之后進行校正:在OpenCV中可通過stereoRectify()函數完成校正功能,攝像機矩陣,畸變向量,左右旋轉矩陣R和平移向量T。輸出參數為左右投影矩陣P,以及重投影矩陣Q。可調用函數InitUndistortRectifyMap()生成圖像校正所需的映射矩陣。
標定結束后最終得到的yml文件,就是雙目標定的參數矩陣,之后使用它就可以得到校正后的圖像啦。MATLAB里面有雙目標定工具箱很方便,且誤差很小。
Q2:你得到的參數和誤差有什么合格判據嗎?誤差在哪個區間內能用?你怎么確定你得到的參數能用?你有跟別人做的對比過嗎?
單目標定的誤差?看平均重投影誤差,越小越好。
雙目標定看對極線誤差,越小越好,這個關系著后面立體匹配的效果。
在工業生產中,對于雙目相機標定, 需要一個穩定可靠的方法確定標定的質量,以幫助判斷標定結果,確定是否需要重新標定。現有雙目標定的精確度評價研究較少,而且具有明顯的局限性,無法應用于工業環境。現有一種方法可以確定標定質量的方法,可在最新資源中查看。
02
—
雙目匹配
原理:
通過對兩幅圖像視差的計算,直接對前方景物(圖像所拍攝到的范圍)進行距離測量,而無需判斷前方出現的是什么類型的障礙物。所以對于任何類型的障礙物,都能根據距離信息的變化,進行必要的預警或制動。雙目攝像頭的原理與人眼相似。人眼能夠感知物體的遠近,是由于兩只眼睛對同一個物體呈現的圖像存在差異,也稱“視差”。物體距離越遠,視差越小;反之,視差越大。視差的大小對應著物體與眼睛之間距離的遠近,這也是3D電影能夠使人有立體層次感知的原因。
雙目匹配被普遍認為是立體視覺中最困難也是最關鍵的問題。得到視差數據,通過上述原理中的公式就可以很容易的計算出深度信息
OpenCV中提供了兩種立體匹配算法SGBM算法和BM快匹配算法,其中SGBM算法準確性較高,但是運算速度慢。BM算法準確性稍差但運算速度快,可滿足實時應用需求。BM算法在OpenCV中通過函數StereoBM()實現。
接下來就是用基于深度學習的立體匹配算法,讓精度更高,潛力更高的GA-Net