提取ORBSLAM中特征点提取ORBextractor模块

论坛 期权论坛     
匿名技术用户   2021-1-11 22:03   185   0
<p>ORBSLAM2中很多模块可以单独拿出来给自己的程序使用,博主在这里将ORB中特征点提取模块提取出来,供后续自己开发。</p>
<p>与OpenCV库中提供的ORB特征点提取函数相比,ORBSLAM中特征点分布均匀,ORBSLAM将图像划分成若干个区域,在每个区域内设置提取特征点的数量,并设置提取数量的阈值,保证整幅图片特征点数量更均匀。</p>
<p>ORB特征点如何提取在这里不做赘述,很多博客和高博的《视觉SLAM十四讲》讲的都非常清楚。(PS:在这里想推荐一下高博最近新出的《视觉SLAM十四讲 第二版》,大致看了下自认为与第一版相比改变较大,新添加了很多原理性程序,比如手写高斯牛顿法,手写特征点提取,而不仅仅是像第一版用调库的方法实现。)</p>
<p>不多废话,直接上代码:</p>
<p>头文件函数,博主在这里改了一下命名空间的名字,其余没有任何变化,因为这个模块本身在程序中就是单独的一块存在,并不依赖其他功能函数。在头文件中可以看到,作者重载了()运算符,便于调用。</p>
<pre class="blockcode"><code class="language-cpp">#ifndef ORBEXTRACTOR_H
#define ORBEXTRACTOR_H

#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;opencv/cv.h&gt;


namespace myORB
{

class ExtractorNode
{
public:
    ExtractorNode():bNoMore(false){}

    void DivideNode(ExtractorNode &amp;n1, ExtractorNode &amp;n2, ExtractorNode &amp;n3, ExtractorNode &amp;n4);

    std::vector&lt;cv::KeyPoint&gt; vKeys;
    cv::Point2i UL, UR, BL, BR;
    std::list&lt;ExtractorNode&gt;::iterator lit;
    bool bNoMore;
};

class ORBextractor
{
public:
   
    enum {HARRIS_SCORE&#61;0, FAST_SCORE&#61;1 };

    ORBextractor(int nfeatures, float scaleFactor, int nlevels,
                 int iniThFAST, int minThFAST);

    ~ORBextractor(){}

    // Compute the ORB features and descriptors on an image.
    // ORB are dispersed on the image using an octree.
    // Mask is ignored in the current implementation.
    // 重载()运算符,作为对外接口
    void operator()( cv::InputArray image, cv::InputArray mask,
      std::vector&lt;cv::KeyPoint&gt;&amp; keypoints,
      cv::OutputArray descriptors);

    int inline GetLevels(){
        return nlevels;}

    float inline GetScaleFactor(){
        return scaleFactor;}

    std::vector&lt;float&gt; inline GetScaleFactors(){
        return mvScaleFactor;
    }

    std::vector&lt;float&gt; inline GetInverseScaleFactors(){
        return mvInvScaleFactor;
    }

    std::vector&lt;float&gt; inline GetScaleSigmaSquares(){
        return mvLevelSigma2;
    }

    std::vector&lt;float&gt; inline GetInverseScaleSigmaSquares(){
        return mvInvLevelSigma2;
    }

    //存放各层级图片
    std::vector&lt;cv::Mat&gt; mvImagePyramid;

protected:
    //计算高斯金字塔
    void ComputePyramid(cv::Mat image);

    ///对图像金字塔中的每一层图像进行特征点的计算。具体的计算过程是将图像网格分割为小区域,
    /// 每一个小区域独立使用 FAST 角点检测。检测完成之后使用 DistributeOctTree 函数对检测得到的所有角点进行筛选,使得角点分布均匀。
    void ComputeKeyPointsOctTree(std::vector&lt;std::vector&lt;cv::KeyPoint&gt; &gt;&amp; allKeypoints);
    //将关键点分配到四叉树
    std::vector&lt;cv::KeyPoint&gt; DistributeOctTree(const std::vector&lt;cv::KeyPoint&gt;&amp; vToDistributeKeys, const int &amp;minX,
                                           const int &amp;maxX, const int &amp;minY, const int &amp;maxY, const int &amp;nFeatures, const int &amp;level);

    void ComputeKeyPointsOld(std::vector&lt;std::vector&lt;cv::KeyPoint&gt; &gt;&amp; allKeypoints);
    //存储关键点附近patch的点对
    std::vector&lt;cv::Point&gt; pattern;

    int nfeatures; //特征点的个数
    double scaleFactor;  //相邻层图像的比例系数
    int nlevels;    //构造金字塔的层数
    int iniThFAST;  //检测fast角点阈值
    int minThFAST;  //没有检测到角点的前提下降低阈值

    //每层特征点的数量
    std::vector&lt;int&gt; mnFeaturesPerLevel;
    //patch圆的最大坐标
    std::vector&lt;int&gt; umax;
    //每层相对于原始图像的缩放比例
    std::vector&lt;float&gt; mvScaleFactor;
    //每层相对于原始图像缩放比例的倒数
    std::vector&lt;float&gt; mvInvScaleFactor;
    //每层相对于原始图像的缩放比例的平方
    std::vector&lt;float&gt; mvLevelSigma2;
    std::vector&lt;float&gt; mvInvLevelSigma2;
};

} //namespace ORB_SLAM

#endif

</code></pre>
<p>  接下来是cpp文件</p>
<pre class="blockcode"><code class="language-cpp">#include &lt;opencv2/core/core.hpp&gt;
#include &lt;opencv2/highgui/highgui.hpp&gt;
#include &lt;opencv2/features2d/features2d.hpp&gt;
#include &lt;opencv2/imgproc/imgproc.hpp&gt;
#include &lt;vector&gt;

#include &#34;myORBextractor.h&#34;


using namespace cv;
using namespace std;

namespace myORB
{

const int PATCH_SIZE &#61; 31;
const int HALF_PATCH_SIZE &#61; 15;
const int EDGE_THRESHOLD &#61; 19;

// 计算特征点的角度
// u_max:patch的最大半径
static float IC_Angle(const Mat&am
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP