ORB特征点提取代码详解 四叉树均匀化

ORB特征点提取代码详解 ExtractORB

最近在尝试将ORB提取特征点机制放置于芯片上,便于后期调用,减小CPU的计算负担,故最近对ORB特征点提取代码进行了研读,记录一下,有不对的还请指教;

首先在Frame()初始化中,含有ExtractORB(0,imGray); 这次我们研究的全在这个特征点提取函数里面;

void Frame::ExtractORB(int flag, const cv::Mat &im)
{
   
    if(flag==0)
        (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors);
    else
        (*mpORBextractorRight)(im,cv::Mat(),mvKeysRight,mDescriptorsRight);
}

这里用了()的重载,直接跳转 *mpORBextractorLeft ; 跳转至void ORBextractor::operator();
特征点的提取均在此函数实现;

    if(_image.empty())
        return;

    Mat image = _image.getMat();
    assert(image.type() == CV_8UC1 );
    
    // Pre-compute the scale pyramid
    // 构建图像金字塔
    ComputePyramid(image);

读取图片,为空返回; 不然建立金字塔,过程不再阐述;

重点 ComputeKeyPointsOctTree

    // 计算每层图像的兴趣点    //计算关键点并生成四叉树
    vector < vector<KeyPoint> > allKeypoints; // vector<vector<KeyPoint>>
    ComputeKeyPointsOctTree(allKeypoints);
    //ComputeKeyPointsOld(allKeypoints);

首先开辟一个vector < vector > allKeypoints 空间,存放提取的特征点,后面进入 ComputeKeyPointsOctTree, 提取特征点,并采用四叉树的方法对提取的特征点进行均匀化;

void ORBextractor::ComputeKeyPointsOctTree(vector<vector<KeyPoint> >& allKeypoints)
{
   
    allKeypoints.resize(nlevels);

    const float W = 30;

    // 对每一层图像做处理
    for (int level = 0; level < nlevels; ++level)
    {
   
        const int minBorderX = EDGE_THRESHOLD-3;
        const int minBorderY = minBorderX;
        const int maxBorderX = mvImagePyramid[level].cols-EDGE_THRESHOLD+3;
        const int maxBorderY = mvImagePyramid[level
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值