ORB-SLAM(七)ORBextractor 特徵提取

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

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

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

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

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

最後爲了提取出的特徵點在圖像中分佈比較均勻(實際狀況中,特徵點一般分佈得比較集中,這樣不利於進行匹配,也不利於精確地求解相機間的位姿從而獲得精確的VO軌跡),使用了八叉樹(實際上是平面上的四叉樹)的數據結構來存儲提取出的特徵點:blog

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

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

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屬性計算的)最大的,其餘的拋棄!二進制

相關文章
相關標籤/搜索