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

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.xdnf.cn/news/9444.html

相关文章:

  • SAP学习笔记 - 开发14 - 前端Fiori开发 HelloWorld
  • Linux基础指令(一)
  • 木愚科技闪亮第63届高博会 全栈式智能教育解决方案助力教学升级
  • 【容器】docker使用问题处理
  • IoT/基于NB28-A/BC28-CNV通信模组使用AT指令连接华为云IoTDA平台(HCIP-IoT实验2)
  • 打印Yolo预训练模型的所有类别及对应的id
  • 【Rust】Rust获取命令行参数以及IO操作
  • Gartner《2025 年软件工程规划指南》报告学习心得
  • ubuntu国内镜像源手动配置
  • TextIn OCR Frontend前端开源组件库发布!
  • ABP VNext + CRDT 打造实时协同编辑
  • linux中echo命令
  • 深入解析Linux死锁:原理、原因及解决方案
  • 【unity游戏开发——编辑器扩展】EditorUtility编辑器工具类实现如文件操作、进度条、弹窗等操作
  • 计算机网络学习20250528
  • (增强)基于sqlite、mysql、redis的消息存储
  • OpenCV---Canny边缘检测
  • 在 CAD C# 二次开发中,Clipper2、CGAL 和 NTS(NetTopologySuite)对比
  • 上交具身机器人的视觉运动导航!HTSCN:融合空间记忆与语义推理认知的导航策略
  • 11.14 LangGraph检查点系统实战:AI Agent会话恢复率提升287%的企业级方案
  • cuda编程笔记(2)--传递参数、设备属性
  • RabbitMQ监控:关键技术、技巧与最佳实践
  • 【华为战报】4月、5月 HCIP考试战报!
  • 理解并解决高丢包率问题,构建清晰流畅的实时音视频通话
  • 硬件实时时钟(RTC)
  • java调用C语言的dll方法
  • JWT安全:假密钥.【签名随便写实现越权绕过.】
  • PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南
  • TypeScript 中的剩余参数:灵活处理可变数量参数
  • Prometheus + Grafana 监控常用服务