ORB-SLAM(七)ORBextractor 特征提取


該類中主要調用OpenCV中的函數,提取圖像中特征點(關鍵點及其描述,描述子,以及圖像金字塔)

參考TUM1.yaml文件中的參數,每一幀圖像共提取1000個特征點,分布在金字塔8層中,層間尺度比例1.2,計算下來金字塔0層大約有217個特征點,7層大約有50個特征點。這樣有一個比較直觀的概念。

提取特征點使用FAST,但是ORB中的FAST加入了旋轉信息,也就是去計算特征點的角度,同時加入了尺度信息,也就是計算在多層金字塔中去提取。

描述子使用的是BRIEF,通過二進制BRIEF描述子之間的漢明距離來考察兩個特征點之間的相似度。

整個提取過程使用重載了的()操作符來完成。

最后為了提取出的特征點在圖像中分布比較均勻(實際情況中,特征點通常分布得比較集中,這樣不利於進行匹配,也不利於精確地求解相機間的位姿從而得到精確的VO軌跡),使用了八叉樹(其實是平面上的四叉樹)的數據結構來存儲提取出的特征點:

void ORBextractor::ComputeKeyPointsOctTree(vector<vector<KeyPoint> >& allKeypoints);

金字塔中每一層提取出的特征點放在不同的vector<KeyPoint>中;OctTree主要的實現:

vector<cv::KeyPoint> ORBextractor::DistributeOctTree(const vector<cv::KeyPoint>& vToDistributeKeys, const int &minX,
                                       const int &maxX, const int &minY, const int &maxY, const int &N, const int &level);

該樹結構除了根節點其實只實現了3層,最頂層的node數量由圖像的橫縱比決定(例如2);下面兩層最多產生64個葉子。因此,對於前面提到的特征點數,平均每個分割節點中分布一兩個特征點,如果該葉子中含有較多特征點,則選取其中Harris響應值(是由OpenCV的KeyPoint.response屬性計算的)最大的,其他的拋棄!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM