ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-28 12:31:56  阅读:586  来源: 互联网

标签:node 随机性 特征 角点 vPrevSizeAndPointerToNode SLAM3 排序 ORB cmp


即使是在同一数据集的同一张图像上,在不同时刻运行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);

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

标签:node,随机性,特征,角点,vPrevSizeAndPointerToNode,SLAM3,排序,ORB,cmp
来源: https://www.cnblogs.com/yiqian/p/14943948.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有