:四叉树算法如何让特征点均匀分布)
SuperPoint_SLAM 特征提取原理二四叉树算法如何让特征点均匀分布【免费下载链接】SuperPoint_SLAMSuperPoint ORB_SLAM2项目地址: https://gitcode.com/gh_mirrors/su/SuperPoint_SLAMSuperPoint_SLAM 是一款将深度学习特征点网络 SuperPoint 与经典视觉 SLAM 框架 ORB-SLAM2 相结合的算法项目。在上一篇中我们介绍了 SuperPoint 网络如何输出稠密的热力图候选点本篇将聚焦特征提取的最后一道工序——四叉树算法看看它如何让成千上万个候选特征点在图像上均匀分布为后续的位姿估计提供稳定、高质量的输入。为什么特征点必须均匀分布SuperPoint 网络天然有一个毛病它会在纹理丰富的区域墙面花纹、草丛、树叶一口气输出成百上千个候选点而在空旷区域白墙、天空几乎不产生任何点。如果直接把这样的候选点送入 SLAM会带来三个问题特征扎堆大量点挤在一起冗余度高白白浪费计算资源退化风险当相机转向空旷区域时可用特征骤减跟踪极易丢失精度下降位姿估计依赖特征的空间分布分布不均会导致求解病态、误差放大。所以SuperPoint_SLAM 沿用了 ORB-SLAM2 的经典思路在检测之后增加一道空间分配工序也就是本篇主角——四叉树算法OctTree。它的目标简单而强大用最少的特征点覆盖最大的空间范围。上图是 SuperPoint_SLAM 运行时的可视化绿色方框即为经过四叉树算法筛选后的特征点可以看到它们较为均匀地散布在画面各处而不是集中在某一两个角落。SuperPoint_SLAM 特征点均匀分布的完整流程两阶段策略整体流程位于 SPextractor.cc 的ComputeKeyPointsOctTree中由两个阶段接力完成。第一阶段网格化检测先保证不漏检 在每一层图像金字塔上算法先把图像切成约 30×30 像素的小网格然后对每个网格独立调用 SuperPoint 网络的检测接口见 SuperPoint.cc 的SPDetector::getKeyPoints先用较高阈值iniThFAST提取高置信度特征点若该网格一个点都没检测到则改用较低阈值minThFAST再试一次防止纹理较弱区域漏检每个网格内部还会做一次 NMS 非极大值抑制去掉距离过近的冗余点SuperPoint.cc。这一步保证了每个区域都有特征点产出为下一步均匀化提供了充足的候选池。第二阶段四叉树分配保证不扎堆 网格化检测产出的候选点数量通常是目标特征数的数倍甚至十倍。四叉树算法DistributeOctTreeSPextractor.cc的任务就是从这些候选点中挑选出最均匀的 N 个。它不追求最强而追求最匀。四叉树算法核心步骤拆解新手也能看懂步骤一按宽高比划分初始条带 首先根据图像区域的长宽比计算初始节点数量nIni round((maxX - minX) / (maxY - minY))图像越宽初始条带就越多。每个条带相当于四叉树的根节点所有候选点按 x 坐标落入对应的条带中SPextractor.cc。步骤二预处理节点单点停止、空节点删除 ✂️只含1 个点的节点标记为bNoMore true表示无需再分0 个点的节点直接从节点列表中删除含多个点的节点进入下一步的递归分割。步骤三递归四等分 DivideNode 对于含多个点的节点调用DivideNodeSPextractor.cc将其一分为四左上、右上、左下、右下四个子节点。随后遍历节点内的所有特征点按坐标放入对应的子节点。整个算法因此得名四叉树——每一层分裂都产生 4 个子节点。步骤四两种终止条件 ⏹️循环分割直到满足以下任一条件即停止节点总数≥ 目标特征数 N本轮分裂后节点数没有增加说明所有节点都只剩单点无法再分。步骤五防超额的精确分割策略 如果继续全量分裂会导致节点数远超 N算法会采用精准分割只挑点数最多的节点优先分裂每分裂一个节点就检查一次节点总数一旦达到 N 立即停止SPextractor.cc。这样能把最终特征数精确控制在目标值附近既不浪费预算也不超额。步骤六每个节点只保留最强者 分割结束后每个节点内可能仍有多余的点。此时算法遍历所有节点只保留response响应值最高的那个特征点SPextractor.cc。由于四叉树保证了每个空间区域对应一个节点最终结果天然均匀一个区域一个代表点谁也不挤谁。源码位置速查表 功能源码位置节点数据结构ExtractorNodeSPextractor.h节点四等分逻辑SPextractor.cc四叉树分配主算法SPextractor.cc网格化检测与特征提取总流程SPextractor.ccSuperPoint 网络逐网格检测SuperPoint.cc网格内 NMS 抑制SuperPoint.cc小结四叉树算法是 SLAM 特征提取的最佳伴侣 ✅一句话总结SuperPoint 负责找得多四叉树算法负责选得匀。两者结合SuperPoint_SLAM 才能用有限的算力获得覆盖全图的特征分布从而在纹理稀疏、运动剧烈的场景中保持稳定的跟踪。这也解释了为什么在 KITTI 部分序列上SuperPoint 方案能取得比 ORB 更低的轨迹误差——均匀分布的特征正是稳健位姿估计的基石。如果你对 SuperPoint 网络本身的原理感兴趣可以回顾本系列第一篇《SuperPoint_SLAM 特征提取原理一》下一篇我们将继续聊聊特征描述子是如何生成与匹配的。【免费下载链接】SuperPoint_SLAMSuperPoint ORB_SLAM2项目地址: https://gitcode.com/gh_mirrors/su/SuperPoint_SLAM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考