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

ORB_SLAM2原理及代码解析:MapPoint::ComputeDistinctiveDescriptors() 函数

目录

1 作用

2 位置及代码

3 原理解析

3.1 参数及含义

3.1 observations

3.2 vDescriptors.reserve(observations.size());

3.3 if(!pKF->isBad())

3.4 vDescriptors.push_back(pKF->mDescriptors.row(mit->second));

3.5 float Distances[N][N];

3.6 DescriptorDistance()函数

3.7 Distances[i][j]=distij;

1 作用

       每个地图点可能被多个关键帧观察到,每个关键帧有自己的 ORB 描述子。由于噪声、视角和光照变化,同一个地图点在不同关键帧的描述子可能略有差异。该函数为MapPoint选择一个最具代表性的描述子,用于之后的匹配。

思路:

MapPoint → 关键帧 → 收集描述子 → 计算距离 → 选中代表性描述子 → 更新 mDescriptor

2 位置及代码

(1)声明:MapPoint.h

void ComputeDistinctiveDescriptors();

(2)定义:MapPoint.cc

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.reserve(observations.size());for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++){KeyFrame* pKF = mit->first;if(!pKF->isBad())vDescriptors.push_back(pKF->mDescriptors.row(mit->second));}if(vDescriptors.empty())return;// Compute distances between themconst size_t N = vDescriptors.size();float Distances[N][N];for(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 restint BestMedian = INT_MAX;int BestIdx = 0;for(size_t i=0;i<N;i++){vector<int> vDists(Distances[i],Distances[i]+N);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();}
}

3 原理解析

3.1 参数及含义

3.1 observations

存储的是地图点被哪些关键帧观测到了。

例:

假设有一个 MapPoint pMP,它在两个关键帧里被观测到了:

KeyFrame KF1 的第 10 个特征点,在 KeyFrame KF2 的第 35 个特征点

则observations里面存的是KF1 → 10,KF2 → 35。

3.2 vDescriptors.reserve(observations.size());

预先分配空间,容量等于观测数量。

3.3 if(!pKF->isBad())

如果是坏帧,在回环检测、局部优化时会被标记出来。

3.4 vDescriptors.push_back(pKF->mDescriptors.row(mit->second));

(1)pKF->mDescriptors.row(mit->second)

  该 MapPoint 在该关键帧里的 ORB 描述子。

3.5 float Distances[N][N];

Distances[i][j] = 第 i 个描述子 和 第 j 个描述子之间的 Hamming 距离。

3.6 DescriptorDistance()函数

(1)声明:ORBmatcher.h

    // Computes the Hamming distance between two ORB descriptorsstatic int DescriptorDistance(const cv::Mat &a, const cv::Mat &b);

(2)定义:ORBmatcher.cc

int ORBmatcher::DescriptorDistance(const cv::Mat &a, const cv::Mat &b)
{const int *pa = a.ptr<int32_t>();const int *pb = b.ptr<int32_t>();int dist=0;for(int i=0; i<8; i++, pa++, pb++){unsigned  int v = *pa ^ *pb;    //按位异或XORv = v - ((v >> 1) & 0x55555555);   //0x55555555 = 二进制 0101...0101,//  把32位按 2 位一组,计算每组里 1 的个数。v = (v & 0x33333333) + ((v >> 2) & 0x33333333);  //把上一步的结果按 4 位一组,计算每组的 1 的个数。dist += (((v + (v >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;//统计成 8 位一组,最后把结果压缩成一个字节,>> 24 把统计出来的 1 的总数移到最低位。}return dist;
}
3.7 Distances[i][j]=distij;

i到j的汉明距离。

http://www.dtcms.com/a/435687.html

相关文章:

  • 最好网站建设制作是那个唐山炎黄宽带网站
  • 【Leetcode hot 100】39.组合总和
  • 简述企业网站的建设过程成都建设局网站
  • 建设银行福州分行招聘网站做网站需要用到那些软件
  • 建网站发信息做推广wordpress做淘客网站
  • 【Stata手动安装ivreghdfe】
  • 网站建设厌倦福州网站制作案例
  • 局域网访问Win11下的WSL中的jupyter notebook
  • 自己做网站要学什么软件google浏览器入口
  • 网站建设硬件环境免费网站建站平台
  • 男女做那种的的视频网站洛可可设计公司logo
  • 零基础做地方门户网站c2c旅游电子商务平台
  • 社区微网站建设方案景安怎么把网站做别名
  • 常见的简单的网站制作邢台谷歌seo
  • 网站网站建设企业建设美丽中国征文大赛
  • I2C总线介绍
  • 哪里有网站app制作网站如何分页
  • 百度 站长工具研究院网站系统建设方案
  • 广东省省考备考(第一百一十二天10.2)——判断推理:加强题型(归纳总结)
  • 德州建设银行兑换网站网站建设价格标准报价单
  • day48-ECS实战3
  • LangChain-03-新型的Chain
  • 景区网站建设策划网站开发项目资金运用明细
  • 网站换了域名怎么查郑州网站开发公司
  • 常州微信网站建设信息英文网站注意事项
  • 模型轻量化三大核心技术之:量化与剪枝
  • 大型购物网站服务器经营性质的网站
  • 道滘镇网站建设如何衡量一个网站的价值
  • 【读书笔记】《C陷阱与缺陷》第8章:编程建议总结 | 写出更健壮的C代码
  • 成都网站关键词汉中网站建设公司