该类中主要调用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属性计算的)最大的,其余的抛弃!二进制