ORB-SLAM2中MapPoints的描述子的计算

//我们在从金字塔的图像中获取特征点时为每一个特征点计算了描述子
//现在看看如何计算一个空间的地图点的描述子
void MapPoint::ComputeDistinctiveDescriptors()
{// Retrieve all observed descriptorsvector<cv::Mat> vDescriptors;//获取到某一个地图点可以被哪些关键帧观测到以及在这些关键帧上与该地图点对应的特征点的编号map<KeyFrame*,size_t> observations;{unique_lock<mutex> lock1(mMutexFeatures);if(mbBad)return;observations=mObservations;}if(observations.empty())return;//vDescriptors用来存储这些所有与可以观测到该地图点的特征点的描述子vDescriptors.reserve(observations.size());for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++){//获取可以观测到此地图点的所有关键帧KeyFrame* pKF = mit->first;//然后获取,在该关键帧下与该地图点对应的特征点的描述子//vDescriptors中存储了所有的那些可以观测到该地图点的图像上的与之对应的特征点的描述子。if(!pKF->isBad())vDescriptors.push_back(pKF->mDescriptors.row(mit->second));}if(vDescriptors.empty())return;// Compute distances between themconst size_t N = vDescriptors.size();//Distances是一个N*N的二维数组float Distances[N][N];//计算任意两个描述子之间的海明距离//Distances[N][N]是一个对称矩阵并且对角线上的元素都为0for(size_t i=0;i<N;i++){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;}}// Take the descriptor with least median distance to the rest//需要找到的是一个最小的中值距离int BestMedian = INT_MAX;int BestIdx = 0;for(size_t i=0;i<N;i++){//将Distences中的每一行单独拿出来//因为在这个矩阵中第i行表示,第i个描述子与其他所有描述子之间的海明距离vector<int> vDists(Distances[i],Distances[i]+N);//将这些距离进行排序sort(vDists.begin(),vDists.end());//经过排序之后都要取排序后的中值int median = vDists[0.5*(N-1)];//遍历Distances中的所有行找到一个最小的中值,那么该描述子就可以代表这个地图点的描述子if(median<BestMedian){BestMedian = median;BestIdx = i;}}{unique_lock<mutex> lock(mMutexFeatures);mDescriptor = vDescriptors[BestIdx].clone();}
}

Take the descriptor with least median distance to the rest

就是在所有的描述子中找到那个与其他所有的描述子之间的距离的中值最小的描述子作为该地图点的描述子,

这里选择的是中值作为衡量标准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU:4185-Oil Skimming

Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description Thanks to a certain “green” resources company, there is a new profitable industry of oil skimming. There are large slicks of crude oil floa…

域控制器情况分析

域控制器情况分析 1、Windows Server 的 Foundation、Standard、Enterprise 以及 Datacenter 版本号既可作为源server&#xff0c;也可作为目标server。仅支持将 Foundation Server 版本号作为受限方案中的目标server。在使用 Foundation Server 作为目标server之前&#xff0c…

Linux基础命令---su

su临时切换身份到另外一个用户&#xff0c;使用su切换用户之后&#xff0c;不会改变当前的工作目录&#xff0c;但是会改变一些环境变量。此命令的适用范围&#xff1a;RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。1、语法su [选项] [参数]2、选项列表--help显示…

在Ubuntu 16.04 上安装和卸载matlab 2018b(Install and uninstall matlab 2018b on ubuntu)

1.安装2018b可以参考下面两篇文章 https://www.ph0en1x.space/2018/04/23/ubuntu_matlab/ https://blog.csdn.net/qq_32892383/article/details/79670871 2.卸载2018b 我的默认安装在 /usr/local/MATLAB $ sudo rm -r /usr/local/MATLAB $ cd ~ $ ll (这个时候可以看到隐…

04.openssl编程——哈希表

4.1 哈希表在一般的数据结构如线性表和树中&#xff0c;记录在结构中的相对位置与记录的关键字之间不存在确定的关系&#xff0c;在结构中查找记录时需要进行一系列的关键字比较。这一类查找方法建立在比较的基础上&#xff0c;查找的效率与比较次数密切相关。理想的情况是能…

shell数组中“和@的妙用

#!/bin/bashlist(4k"8k a bit""16k abc""32k gold"64k)for i in "${list[]}"do echo $idone 分别对比一下不带” 和换成*&#xff0c;之间的区别。转载于:https://www.cnblogs.com/zjd2626/p/7041341.html

「JupyterLab」 Jupyter Notebook 新生代IDE模式页面

参考&#xff1a;Overview 安装&#xff1a; $ pip install jupyterlab 启动&#xff08;不是jupyter notebook&#xff09;&#xff1a; $ jupyter lab Jupyterlab中最好用的就是显示csv数据。CSV数据显示效果&#xff1a; 安装插件 jupyterlab是和jupyter notebook隔离的&…

undefined reference to 'pthread_create'

刚在Ubuntu16.04 上用Clion写一个"单生产者-单消费者"的线程的程序&#xff0c;源程序可以参考下面的网址 https://www.cnblogs.com/haippy/p/3252092.html 在编译的时候编译器给的提示是&#xff1a; undefined reference to pthread_create 解决办法就是在CMake…

windows下安装vundle

windows下安装vundle ## 前言 windows下安装vundle和linux下稍微有些不一样&#xff0c;虽然官网给出了 安装说明&#xff0c;但是有些问题的。E117: Unknown function: vundle#begin ## 安装步骤 参考官方文档即可vundle ## 问题处理 修改_vimrc配置文件内容&#xff0c;这是正…

深度学习框架不能“包治百病”,开发者如何选出最适合自己的?

随着深度学习关注度和势头上升&#xff0c;深度学习被越来越多的企业和组织的生产实践结合起来。这时&#xff0c;无论是对于深度学习相关专业的初学者&#xff0c;还是已经在企业和组织中从事工业场景应用和研发的开发者来说&#xff0c;选择一个适合自己&#xff0c;适合业务…

Linux+CLion+cmake 动态链接库的使用

在作《剑指offer》中的单向链表的题目时&#xff0c;需要一些常用到的操作链表的函数放在一个文件下&#xff0c;我想把这些函数的声明都写在list.h文件中&#xff0c;把这些函数的定义都写在list.cpp文件中&#xff0c;这样就可以在测试文件test.cpp中调用list.cpp中定义的函数…

PAT(乙级)1009

1009. 说反话 (20)给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a;测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字母&…

库存扣减问题

2019独角兽企业重金招聘Python工程师标准>>> 并发减库存 并发扣库存问题总结 库存扣减还有这么多方案&#xff1f; | 架构师之路 转载于:https://my.oschina.net/u/2939155/blog/3004363

HSRPSTPACL

1 HSRP配置 1.1 问题 在企业网络到外部的连接方案中&#xff0c;要求不高的条件下可以是单出口。一旦该出口线路出现问题&#xff0c;整个企业网络就不能连接到外网了。为了使得企业网络到外网连接的高可用性&#xff0c;可以设置两个以上的出口&#xff0c;然而多个出口对…

java 的 CopyOnWriteArrayList类

初识CopyOnWriteArrayList 第一次见到CopyOnWriteArrayList&#xff0c;是在研究JDBC的时候&#xff0c;每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的&#xff0c;为了证明这一点&#xff0c;贴两段代码&#xff0c;第一段在com.mysql.jdbc.Driver下&#xff0…

科技的趋势!AI将进军了37%的企业

2019独角兽企业重金招聘Python工程师标准>>> 市场研究机构Gartner调查了全球89个国家的逾3,000名信息长&#xff08;CIO&#xff09;&#xff0c;显示有37%的企业已经或打算于近期内部署人工智能&#xff08;AI&#xff09;&#xff0c;在4年内成长270%。Gartner研究…

CMakeLists.txt编写规则

在PROJECT_SOURCE_DIR下新建了src, include, lib, bin四个子文件夹。 src文件夹用来存放所有的.cpp文件&#xff0c;include文件夹用来存储所有的.h文件&#xff0c; lib中存放生成的自己编写的共享库&#xff0c; bin中存放所有的可执行文件 用SET来设置.exe可执行文件和共享…

nginx.conf配置详解

######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组 user www www;#nginx进程数&#xff0c;建议设置为等于CPU总核心数。 worker_processes 8;#全局错误日志定义类型&#xff0c;[ debug | info | notice | warn | error | crit ] error_log /usr/local…

更新 hadoop eclipse 插件

卸载hadoop 1.1.2插件。并安装新版hadoop 2.2.0插件。 假设直接删除eclipse plugin文件夹下的hadoop 1.1.2插件&#xff0c;会导致hadoop 1.1.2插件残留在eclipse中&#xff0c;在eclipse perspective视图中有Map/Reduce视图&#xff0c;可是没有图标&#xff0c;新建项目也不会…

【K8S学习笔记】Part1:使用端口转发访问集群内的应用

本文介绍如何使用kubectl port-forward命令连接K8S集群中运行的Redis服务。这种连接方式有助于数据库的调试工作。 注意&#xff1a;本文针对K8S的版本号为v1.9&#xff0c;其他版本可能会有少许不同。 0x00 准备工作 在进行该操作之前&#xff0c;需要满足以下条件&#xff1a…