ORB-SLAM3特征点随机性问题的解决

本文介绍了ORB-SLAM3在特征点提取过程中存在的随机性问题,以及如何通过改进排序方法来确保在同一图像和配置下,特征点提取结果的一致性,从而简化调试过程。核心在于修改DistributeOctTree()函数中的排序逻辑,以保证特征点分布的稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORB-SLAM3特征点随机性问题的解决 - 一只名为狗的猫 - 博客园 (cnblogs.com)转载

即使是在同一数据集的同一张图像上,在不同时刻运行ORB-SLAM3,提取的特征点位置或数量都会存在一定随机性。比如我们要在第0帧上提取10000个特征点,第一次运行时,系统提取了10002个,第二次运行可能就变成了10004个。虽然这种微小的差异不会对系统运行产生影响,但会给调试带来不便。我们希望,不同时刻运行时,特征点的结果都是稳定的,即对于同一图像和配置文件,Frame类的data member std::vector<cv::KeyPoint> mvKeys存储的特征点信息是不变的。

问题出在函数vector<cv::KeyPoint> ORBextractor::DistributeOctTree()中。这个函数将图像视作root node,将每个node分割成4个child node,不断迭代直到node的数量达到要求(比如10000)。之后从每个node中的fast角点里挑选出结果最好的那个,这样就保证了特征点的分布均匀。迭代中会对node按照包含角点的数量进行一次升序排序:

sort(vPrevSizeAndPointerToNode.begin(), vPrevSizeAndPointerToNode.end());

如果某些node包含相同数量的角点,那么每次排序的结果都会出现一定差异。通俗些,大家都有x个角点,按照数量排序,这次你在前,他在后,下次就是他在前,你在后。这种差异就导致了后续分割结果的随机性。解决这个问题也很容易,我们再写一个cmp()函数指定排序方法:

bool cmp( pair<int,ExtractorNode*>& a, pair<int,ExtractorNode*>& b)
{
    return a.first < b.first;
}

修改被调用的sort()函数为:

sort(vPrevSizeAndPointerToNode.begin(), vPrevSizeAndPointerToNode.end(), cmp);

这样就保证了特征点提取结果的稳定,也方便后面的调试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值