当前位置: 首页 > article >正文

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

一、ExtractorNode::DivideNode

void ExtractorNode::DivideNode(ExtractorNode &n1, ExtractorNode &n2, ExtractorNode &n3, ExtractorNode &n4)
{const int halfX = ceil(static_cast<float>(UR.x-UL.x)/2);const int halfY = ceil(static_cast<float>(BR.y-UL.y)/2);//Define boundaries of childsn1.UL = UL;n1.UR = cv::Point2i(UL.x+halfX,UL.y);n1.BL = cv::Point2i(UL.x,UL.y+halfY);n1.BR = cv::Point2i(UL.x+halfX,UL.y+halfY);n1.vKeys.reserve(vKeys.size());n2.UL = n1.UR;n2.UR = UR;n2.BL = n1.BR;n2.BR = cv::Point2i(UR.x,UL.y+halfY);n2.vKeys.reserve(vKeys.size());n3.UL = n1.BL;n3.UR = n1.BR;n3.BL = BL;n3.BR = cv::Point2i(n1.BR.x,BL.y);n3.vKeys.reserve(vKeys.size());n4.UL = n3.UR;n4.UR = n2.BR;n4.BL = n3.BR;n4.BR = BR;n4.vKeys.reserve(vKeys.size());//Associate points to childsfor(size_t i=0;i<vKeys.size();i++){const cv::KeyPoint &kp = vKeys[i];if(kp.pt.x<n1.UR.x){if(kp.pt.y<n1.BR.y)n1.vKeys.push_back(kp);elsen3.vKeys.push_back(kp);}else if(kp.pt.y<n1.BR.y)n2.vKeys.push_back(kp);elsen4.vKeys.push_back(kp);}if(n1.vKeys.size()==1)n1.bNoMore = true;if(n2.vKeys.size()==1)n2.bNoMore = true;if(n3.vKeys.size()==1)n3.bNoMore = true;if(n4.vKeys.size()==1)n4.bNoMore = true;}

以下是 ExtractorNode::DivideNode 函数的详细解析,结合其在特征提取中的应用场景:


功能概述

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


输入与输出

  • 输入:四个子节点的引用 n1, n2, n3, n4
  • 输出:子节点的边界和分配后的特征点集合。

代码解析

1. 计算子节点边界
const int halfX = ceil(static_cast<float>(UR.x - UL.x)/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. 定义子节点坐标
// n1(左上子节点)
n1.UL = UL;  // 左上角继承父节点
n1.UR = cv::Point2i(UL.x + halfX, UL.y);  
http://www.lryc.cn/news/2395397.html

相关文章:

  • nt!MmMapViewInSystemCache函数分析PointerPte的填充
  • 3D Tiles高级样式设置与条件渲染(3)
  • 通义灵码深度实战测评:从零构建智能家居控制中枢,体验AI编程新范式
  • 头歌之动手学人工智能-Pytorch 之优化
  • 基于谷歌ADK的智能客服系统简介
  • (一)视觉——工业相机(以海康威视为例)
  • DAY 36 超大力王爱学Python
  • 基于React + TypeScript构建高度可定制的QR码生成器
  • DeepSeek进阶教程:实时数据分析与自动化决策系统
  • visual studio 2022 初学流程
  • SRD-12VDC-SL-C 继电器‌接线图解
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的企业组织生态化重构研究
  • 前端面经 两栏布局
  • 2,QT-Creator工具创建新项目教程
  • 《深入解析SPI协议及其FPGA高效实现》-- 第一篇:SPI协议基础与工作机制
  • 2025年5月6日 飞猪Java一面
  • ​​技术深度解析:《鸿蒙5.0+:AI驱动的全场景功耗革命》​
  • Nodejs+http-server 使用 http-server 快速搭建本地图片访问服务
  • Zsh/Bash Conda设置延迟启动,启动速度优化
  • 【AI论文】推理语言模型的强化学习熵机制
  • Java中的JSONObject详解:从基础到高级应用
  • Ubuntu22.04 安装 IsaacSim 4.2.0
  • 子串题解——和为 K 的子数组【LeetCode】
  • 深入理解设计模式之访问者模式
  • Java代码重构:如何提升项目的可维护性和扩展性?
  • 《Python语言程序设计》2018 第4章第9题3重量和价钱的对比,利用第7章的概念来解答你
  • Nginx安装操作命令
  • 在IIS上无法使用PUT等请求
  • Codeforces Round 1028 (Div. 2) B. Gellyfish and Baby‘s Breath
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)