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

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

目录

1 作用

2 位置及代码

3 参数及含义

4 代码解析

4.1 加锁及拷贝数据

4.2 检测是否观测

4.3 计算平均法向量

4.3.1 GetCameraCenter() 函数

4.3.2 normali / cv::norm(normali)

4.4 计算平均可观测距离

4.5 更新成员变量

1 作用

       更新地图点的法向量 (mNormalVector),更新地图点的可观测距离范围 (mfMinDistance / mfMaxDistance)以便后续在跟踪或重建中判断该点是否可见。即把地图点的方向和深度信息 重新计算一遍。

2 位置及代码

(1)声明:MapPoint.h

    void UpdateNormalAndDepth();

(2)定义:MapPoint.cc

void MapPoint::UpdateNormalAndDepth()
{map<KeyFrame*,size_t> observations;KeyFrame* pRefKF;cv::Mat Pos;{unique_lock<mutex> lock1(mMutexFeatures);unique_lock<mutex> lock2(mMutexPos);if(mbBad)return;observations=mObservations;pRefKF=mpRefKF;Pos = mWorldPos.clone();}if(observations.empty())return;cv::Mat normal = cv::Mat::zeros(3,1,CV_32F);int n=0;for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++){KeyFrame* pKF = mit->first;cv::Mat Owi = pKF->GetCameraCenter();cv::Mat normali = mWorldPos - Owi;normal = normal + normali/cv::norm(normali);n++;}cv::Mat PC = Pos - pRefKF->GetCameraCenter();const float dist = cv::norm(PC);const int level = pRefKF->mvKeysUn[observations[pRefKF]].octave;const float levelScaleFactor =  pRefKF->mvScaleFactors[level];const int nLevels = pRefKF->mnScaleLevels;{unique_lock<mutex> lock3(mMutexPos);mfMaxDistance = dist*levelScaleFactor;mfMinDistance = mfMaxDistance/pRefKF->mvScaleFactors[nLevels-1];mNormalVector = normal/n;}
}

3 参数及含义

4 代码解析

4.1 加锁及拷贝数据
    map<KeyFrame*,size_t> observations;KeyFrame* pRefKF;cv::Mat Pos;{unique_lock<mutex> lock1(mMutexFeatures);unique_lock<mutex> lock2(mMutexPos);if(mbBad)return;observations=mObservations;pRefKF=mpRefKF;Pos = mWorldPos.clone();}
4.2 检测是否观测
    if(observations.empty())return;
4.3 计算平均法向量
    cv::Mat normal = cv::Mat::zeros(3,1,CV_32F);int n=0;for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++){KeyFrame* pKF = mit->first;cv::Mat Owi = pKF->GetCameraCenter();cv::Mat normali = mWorldPos - Owi;normal = normal + normali/cv::norm(normali);n++;}
4.3.1 GetCameraCenter() 函数

(1)声明:frame.h

    // Returns the camera center.inline cv::Mat GetCameraCenter(){return mOw.clone();}

(2)定义:KeyFrame.cc

cv::Mat KeyFrame::GetCameraCenter()
{unique_lock<mutex> lock(mMutexPose);return Ow.clone();
}

相机中心Ow运算见SetPose() 函数-2.2:

https://blog.csdn.net/weixin_45728280/article/details/152333209?spm=1011.2124.3001.6209

4.3.2 normali / cv::norm(normali)

将向量单位化,只考虑方向,忽略大小。

4.4 计算平均可观测距离
    cv::Mat PC = Pos - pRefKF->GetCameraCenter();   //地图点(三维点世界坐标)到关键帧相机中心向量const float dist = cv::norm(PC);//地图点(三维点世界坐标)到关键帧相机中心距离const int level = pRefKF->mvKeysUn[observations[pRefKF]].octave;//计算地图点可观测距离时需要考虑尺度const float levelScaleFactor =  pRefKF->mvScaleFactors[level];//特征点在金字塔层数,后续调整尺度const int nLevels = pRefKF->mnScaleLevels;//获取金字塔总层数
4.5 更新成员变量
    {unique_lock<mutex> lock3(mMutexPos);mfMaxDistance = dist*levelScaleFactor;mfMinDistance = mfMaxDistance/pRefKF->mvScaleFactors[nLevels-1];//最小距离 = 最大距离 / 最小尺度因子mNormalVector = normal/n;//地图点被关键帧测得的平均方向}

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

相关文章:

  • 4-2. 二叉搜索树 (BST)
  • 做英文网站的标准字体鱼巴士设计师服务平台
  • 做网站流量是什么珠海网站建设优化
  • NTLite(操作系统定制工具)
  • 模块即服务?厘清 Linux 系统服务与微服务架构的本质区别
  • 成都电商网站开发免费送的广告怎么在网站上做
  • 熊猫网站ppt外贸网建站
  • 设计模式第六章(观察者模式)
  • C4D R20新增功能平滑滤镜和调整外形滤镜深度解析
  • 数据安全风险评估
  • 动漫共和国 | window版本
  • 校园网站如何建立在浙学网页设计与制作答案
  • 企业创建网站的途径都有啥深圳市浩天建设网站
  • 做外贸国外网站苏宁电器网站建设特点分析
  • AI自动化测试:接口测试全流程自动化的实现方法——技术深度与行业实践剖析
  • LeeCode 328. 奇偶链表
  • 【Linux CentOS 7 版本更换yum源】
  • ⚡ WSL2 搭建 s5p6818 Linux 嵌入式开发平台 (part 3):Wifi驱动移植、ssh移植、e2fsprogs移植
  • 建网站怎么弄在线制作app平台
  • 进程的概念(下)
  • 网站开发安装win10家庭版广告设计公司组织结构图
  • 自媒体时代做网站有前途吗网站备案审批号
  • 为何“过度工程”会发生
  • Linux多线程服务端编程:使用muduo C++网络库学习之环境配置
  • 新质生产力
  • 嵌入式八股文篇——P1 关键字篇
  • 河源正规网站建设价格广东省深圳市公司
  • Core Speech Kit简介
  • 【OTA专题】3.实现简单的boot和APP程序逻辑
  • 营销单页模板网站怎么买网站域名