zoukankan      html  css  js  c++  java
  • 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属性计算的)最大的,其他的抛弃!

  • 相关阅读:
    Codeforce821E Okabe and El Psy Kongroo
    hihocoder1497 Queen Attack
    hihocoder 1523数据重排
    codeforce 780C Andryusha and Colored Balloons
    codeforce 768B Code For 1
    hihoCoder1270 建造基地 完全背包
    UVA10054 The Necklace 欧拉回路+并查集
    Codeforces Round #480 (Div. 2) C 贪心 D 数字、思维 E 树上倍增
    ZOJ 4029 Now Loading!!! 思维
    西安电子科技大学第16届程序设计竞赛网络同步赛 E dp G 找规律
  • 原文地址:https://www.cnblogs.com/shang-slam/p/6421940.html
Copyright © 2011-2022 走看看