ORB-SLAM2学习笔记:ExtractorNode::DivideNode和ORBextractor::DistributeOctTree函数详解

[复制链接]
发表于 2025-9-16 20:48:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、ExtractorNode:ivideNode

  1. void ExtractorNode::DivideNode(ExtractorNode &n1, ExtractorNode &n2, ExtractorNode &n3, ExtractorNode &n4)
  2. {
  3.    
  4.    
  5.     const int halfX = ceil(static_cast<float>(UR.x-UL.x)/2);
  6.     const int halfY = ceil(static_cast<float>(BR.y-UL.y)/2);
  7.     //Define boundaries of childs
  8.     n1.UL = UL;
  9.     n1.UR = cv::Point2i(UL.x+halfX,UL.y);
  10.     n1.BL = cv::Point2i(UL.x,UL.y+halfY);
  11.     n1.BR = cv::Point2i(UL.x+halfX,UL.y+halfY);
  12.     n1.vKeys.reserve(vKeys.size());
  13.     n2.UL = n1.UR;
  14.     n2.UR = UR;
  15.     n2.BL = n1.BR;
  16.     n2.BR = cv::Point2i(UR.x,UL.y+halfY);
  17.     n2.vKeys.reserve(vKeys.size());
  18.     n3.UL = n1.BL;
  19.     n3.UR = n1.BR;
  20.     n3.BL = BL;
  21.     n3.BR = cv::Point2i(n1.BR.x,BL.y);
  22.     n3.vKeys.reserve(vKeys.size());
  23.     n4.UL = n3.UR;
  24.     n4.UR = n2.BR;
  25.     n4.BL = n3.BR;
  26.     n4.BR = BR;
  27.     n4.vKeys.reserve(vKeys.size());
  28.     //Associate points to childs
  29.     for(size_t i=0;i<vKeys.size();i++)
  30.     {
  31.    
  32.    
  33.         const cv::KeyPoint &kp = vKeys[i];
  34.         if(kp.pt.x<n1.UR.x)
  35.         {
  36.    
  37.    
  38.             if(kp.pt.y<n1.BR.y)
  39.                 n1.vKeys.push_back(kp);
  40.             else
  41.                 n3.vKeys.push_back(kp);
  42.         }
  43.         else if(kp.pt.y<n1.BR.y)
  44.             n2.vKeys.push_back(kp);
  45.         else
  46.             n4.vKeys.push_back(kp);
  47.     }
  48.     if(n1.vKeys.size()==1)
  49.         n1.bNoMore = true;
  50.     if(n2.vKeys.size()==1)
  51.         n2.bNoMore = true;
  52.     if(n3.vKeys.size()==1)
  53.         n3.bNoMore = true;
  54.     if(n4.vKeys.size()==1)
  55.         n4.bNoMore = true;
  56. }
复制代码
以下是 ExtractorNode:ivideNode 函数的详细剖析,连合其在特性提取中的应用场景:
<hr> 功能概述

该函数用于将当前节点(父节点)分割为四个子节点(n1-n4),并将父节点中的特性点(vKeys)按坐标分配到对应的子节点中,是ORB特性匀称化分布的核心操作,常用于四叉树分割策略中。
<hr> 输入与输出


      
  • 输入:四个子节点的引用 n1, n2, n3, n4。  
  • 输出:子节点的界限和分配后的特性点聚集。
<hr> 代码剖析

1. 盘算子节点界限

  1. const int halfX = ceil(static_cast<float>(UR.x - UL.x)/2);
  2. const int halfY = ceil(static_cast<float>(BR.y - UL.y)/2);
复制代码

      
  • 功能:盘算父节点宽度(UR.x - UL.x)和高度(BR.y - UL.y)的一半,使用 ceil 确保分割后子节点覆盖整个父地域。  
  • 示例:若父节点宽度为奇数(如5像素),halfX=3,保证子节点无遗漏。
2. 界说子节点坐标

  1. // n1(左上子节点)
  2. n1.UL = UL;  // 左上角继承父节点
  3. n1.UR = cv::Point2i(UL.x + halfX, UL.y);  // 右上角右移 halfX
  4. n1.BL
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表