首页 > 编程语言 >ORB-SLAM2源码学习:MapPoint.cc:MapPoint::ComputeDistinctiveDescriptors()计算地图点最有代表性的描述子

ORB-SLAM2源码学习:MapPoint.cc:MapPoint::ComputeDistinctiveDescriptors()计算地图点最有代表性的描述子

时间:2024-11-30 16:00:04浏览次数:7  
标签:Distances 关键帧 cc MapPoint vDescriptors 源码 observations mit 描述

前言

地图点在投影匹配时只能对应一个特征描述子,选择具有代表性的描述子是必要的。

1.函数声明

/*
 由于一个地图点会被许多相机观测到,因此在插入关键帧后,需要判断是否更新代表当前点的描述子 
 先获得当前点的所有描述子,然后计算描述子之间的两两距离,最好的描述子与其他描述子应该具有最小的距离 
 中值*/
void MapPoint::ComputeDistinctiveDescriptors()
{
    ....
}

2.函数定义

1.获取地图点的所有观测关键帧的信息。

// Retrieve all observed descriptors
    vector<cv::Mat> vDescriptors;

    map<KeyFrame*,size_t> observations;

    {
        unique_lock<mutex> lock1(mMutexFeatures);
        if(mbBad)
            return;
        observations=mObservations;
    }

    if(observations.empty())
        return;

    vDescriptors.reserve(observations.size());

2.遍历观察到该点的关键帧,把其对应的特征描述子放在一个向量中。

for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++)
    {
        // mit->first取观测到该地图点的关键帧
        // mit->second取该地图点在关键帧中的索引
        KeyFrame* pKF = mit->first;

        if(!pKF->isBad())        
            // 取对应的描述子向量                                               
            vDescriptors.push_back(pKF->mDescriptors.row(mit->second));     
    }

    if(vDescriptors.empty())
        return;

3.计算描述子之间的距离

const size_t N = vDescriptors.size();
	
    // 将Distances表述成一个对称的矩阵
    // float Distances[N][N];
	std::vector<std::vector<float> > Distances;
	Distances.resize(N, vector<float>(N, 0));
	for (size_t i = 0; i<N; i++)
    {
        // 和自己的距离当然是0
        Distances[i][i]=0;
        // 计算并记录不同描述子距离
        for(size_t j=i+1;j<N;j++)
        {
            int distij = ORBmatcher::DescriptorDistance(vDescriptors[i],vDescriptors[j]);
            Distances[i][j]=distij;
            Distances[j][i]=distij;
        }
    }

4.选择最具有代表性的描述子 

int BestMedian = INT_MAX;   // 记录最小的中值
    int BestIdx = 0;            // 最小中值对应的索引
    for(size_t i=0;i<N;i++)
    {
        // 第i个描述子到其它所有描述子之间的距离
        // vector<int> vDists(Distances[i],Distances[i]+N);
		vector<int> vDists(Distances[i].begin(), Distances[i].end());
		sort(vDists.begin(), vDists.end());

        // 获得中值
        int median = vDists[0.5*(N-1)];
        
        // 寻找最小的中值
        if(median<BestMedian)
        {
            BestMedian = median;
            BestIdx = i;
        }
    }

    {
        unique_lock<mutex> lock(mMutexFeatures);
        mDescriptor = vDescriptors[BestIdx].clone();       
    }
}

结束语

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

标签:Distances,关键帧,cc,MapPoint,vDescriptors,源码,observations,mit,描述
From: https://blog.csdn.net/2301_76831056/article/details/143646473

相关文章

  • ORB-SLAM2源码学习:LocalMapping.cc: LocalMapping::MapPointCulling剔除不合格的地图
    前言新增地图点需要经过比较严苛的筛选才能留下,只有这样才能提高定位和建图的准确性、控制地图建图规模、降低计算量。新增地图点主要来自a.双目相机和RGB-D相机模式下的跟踪线程产生的地图点b.局部建图线程中关键帧之间生成的新的地图点。 函数声明voidLocalMapping::M......
  • ORB-SLAM2 ---- LocalMapping::MapPointCulling()和LocalMapping::CreateNewMapPoints
    文章目录一、函数意义二、LocalMapping::MapPointCulling()1.函数讲解2.函数代码三、LocalMapping::CreateNewMapPoints()1.函数讲解2.函数代码四、总结一、函数意义这两个函数是局部见图的核心函数之二,作用是删除不好的地图点,为创造新的地图点。学习局部建图......
  • flask框架高校疫情管理系统的设计与实现(毕设源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校疫情管理系统的研究,现有研究主要以疫情防控的某一环节或部分功能为主,如健康监测或物资管理等。专门针对集班级、学生、健康信......
  • flask框架化妆品商城网站(毕设源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于化妆品商城网站的研究,现有研究主要以大型综合电商平台中的化妆品板块为主,专门针对独立的化妆品商城网站的研究较少。在国内外,电商......
  • springboot343大学生选修选课系统的设计与实现(论文+源码)_kaic
     毕业设计(论文)大学生选修选课系统设计与实现      摘 要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装大学生选修选课系统软件来发挥其高效地信息处理......
  • 在线考试系统(源码+数据库+报告)
    基于SpringBoot的在线考试系统,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下。前台:-首页:展示系统的一些基本信息和轮播图。-试卷表:展示可供用户选择的试卷列表。-公告:展示系统的公告信息,包括考试通知、成绩公布等。-课程:展示用户所选课程的相......
  • 学生网上选课系统(源码+数据库+报告)
    316基于SpringBoot的学生网上选课系统,系统包含三种角色:管理员、老师、学生,系统分为前台和后台两大模块,主要功能如下。管理员:个人中心:管理个人信息,包括修改个人信息、查看选课记录等。基础数据管理:管理系统的基础数据,包括学院信息、专业信息、班级信息等。教学资源管理:管......
  • 基于Web实现的就业信息管理系统设计与实现(计算机毕业设计,附源码+文档)
    文章目录1.内容见下图2.详细视频演示3.系统运行效果介绍4.技术框架4.1前后端分离架构介绍4.3程序操作流程5.项目推荐6.成品项目7.系统测试7.1系统测试的目的7.2系统功能测试8.代码参考9.为什么选择我?10.获取源码1.内容见下图2.详细视频演示文章......
  • 【bluedroid】A2dp Source播放流程源码分析
    在蓝牙音频传输领域,A2DP(AdvancedAudioDistributionProfile,高级音频分发协议)扮演着关键角色,它能够实现高质量音频(如立体声音乐)通过蓝牙在不同设备间的传输。在Android系统所采用的Bluedroid蓝牙协议栈里,A2DPSource承担着音频流发送的重任,将音频数据传输至A2DPSink(像......
  • 开源短视频源码,通过压缩和合并资源实现首屏优化
    开源短视频源码,通过压缩和合并资源实现首屏优化通过压缩CSS、JavaScript和HTML等开源短视频源码中的静态资源文件,并将它们合并为较少的文件,可以减少网络请求次数和文件大小,加快页面加载速度。压缩以下是一个示例Webpack配置文件,展示如何使用css-minimizer-webpack-plugi......