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

ORB-SLAM2源码学习:KeyFrame.cc④: void KeyFrame::UpdateBestCovisibles更新最佳共视

前言

在添加新连接之后就要重新对所有的共视关键帧和权重的那两个列表重新进行降序排列,这样非常容易知道列表的第一位就是最佳共视关键帧和权重。

总的来说就是只要权重发生了变化就要调用这个函数来修改mvpOrderedConnectedKeyFrames共视关键帧和mvOrderedWeights权重这两个列表。

1.函数声明

void KeyFrame::UpdateBestCovisibles()

2.函数定义

/*
 按照权重从大到小对连接(共视)的关键帧进行排序
 更新后的变量存储在mvpOrderedConnectedKeyFrames和mvOrderedWeights中
 */
void KeyFrame::UpdateBestCovisibles()
{
    // 互斥锁,防止同时操作共享数据产生冲突
    unique_lock<mutex> lock(mMutexConnections);
    // http://stackoverflow.com/questions/3389648/difference-between-stdliststdpair-and-stdmap-in-c-stl (std::map 和 std::list<std::pair>的区别)
    
    vector<pair<int,KeyFrame*> > vPairs;
    vPairs.reserve(mConnectedKeyFrameWeights.size());
    // 取出所有连接的关键帧,mConnectedKeyFrameWeights的类型为std::map<KeyFrame*,int>,而vPairs变量将共视的地图点数放在前面,利于排序
    for(map<KeyFrame*,int>::iterator mit=mConnectedKeyFrameWeights.begin(), mend=mConnectedKeyFrameWeights.end(); mit!=mend; mit++)
       vPairs.push_back(make_pair(mit->second,mit->first));

    // 按照权重进行排序(默认是从小到大)
    sort(vPairs.begin(),vPairs.end());

    // 为什么要用链表保存?因为插入和删除操作方便,只需要修改上一节点位置,不需要移动其他元素
    list<KeyFrame*> lKFs;   // 所有连接关键帧
    list<int> lWs;          // 所有连接关键帧对应的权重(共视地图点数目)
    for(size_t i=0, iend=vPairs.size(); i<iend;i++)
    {
        // push_front 后变成从大到小
        lKFs.push_front(vPairs[i].second);
        lWs.push_front(vPairs[i].first);
    }

    // 权重从大到小排列的连接关键帧
    mvpOrderedConnectedKeyFrames = vector<KeyFrame*>(lKFs.begin(),lKFs.end());
    // 从大到小排列的权重,和mvpOrderedConnectedKeyFrames一一对应
    mvOrderedWeights = vector<int>(lWs.begin(), lWs.end());
}

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。


http://www.kler.cn/a/533836.html

相关文章:

  • 苹果再度砍掉AR眼镜项目?AR真的是伪风口吗?
  • C++ 学习:深入理解 Linux 系统中的冯诺依曼架构
  • DeepSeek AI模型本地部署指南:让技术变得简单
  • (脚本学习)BUU18 [CISCN2019 华北赛区 Day2 Web1]Hack World1
  • 使用 DeepSeek-R1 与 AnythingLLM 搭建本地知识库
  • 【蓝桥杯】日志统计
  • HTML-表格,表单标签
  • GitHub Copilot 越狱漏洞
  • VMware Workstation Pro安装了Ubuntu 24.04实现与Windows10之间的复制粘贴
  • linux——网络(服务器的永久不挂——守护进程)
  • MyBatis持久层框架
  • 理解 Maven 的 pom.xml 文件
  • 验证工具:VCS概识
  • Sqli-labs靶场实录(一):Basic Challenges
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_sprintf_str 函数
  • 蓝桥杯思维训练(五)
  • 【Day31 LeetCode】动态规划DP Ⅳ
  • 在深度学习中,样本不均衡问题是一个常见的挑战,尤其是在你的老虎机任务中,某些的中奖倍数较高
  • 网络安全-设备安全加固
  • 【前端】【Ts】【知识点总结】TypeScript知识总结
  • 使用DeepSeek R1 + 了解部署
  • 从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)
  • 【蓝桥杯嵌入式】工程创建
  • MapStruct工具类的使用
  • [论文笔记] Deepseek技术报告
  • 【Elasticsearch】`auto_date_histogram`聚合功能详解