ORB-SLAM3 Sim3Solver.cc相关代码分析与理解

2021SC@SDUSC

文章目录

    • ORB-SLAM3 Sim3Solver.cc相关代码分析与理解
  • 前言
  • 一、MapPoints初始化的相关内容
  • 二、代码分析

前言

这一篇主要是Sim3Solver剩余一些函数的分析


一、MapPoints初始化的相关内容

1.初始化阶段的创建
在Track()函数中调用了各类初始化函数,如双目初始化函数StereoInitialization()、单目初始化函数MonocularInitialization()。以双目初始化为例。对于双目初始化而言,首先就会将当前的普通帧Frame类对象mCurrentFrame变成初始化关键帧KeyFrame类对象pKFini。然后,将初始关键帧插入地图集中。对于常规的相机模型,我们逐个遍历Frame类的mCurrentFrame对象中的N个特征点,根据条件判断是否将其添加为地图点。
2.Tracking阶段的创建
在Tracking阶段,一般使用的两个函数是TrackWithMotionModel()和TrackReferenceKeyFrame()。还有一个TrackLocalMap()函数用于对Tracking结果进行进一步优化。

二、代码分析

1、迭代函数

cv::Mat Sim3Solver::iterate(int nIterations, bool &bNoMore, vector<bool> &vbInliers, int &nInliers)
{bNoMore = false;                        // 现在还没有达到最好的效果vbInliers = vector<bool>(mN1,false);    // 的确和最初传递给这个解算器的地图点向量是保持一致nInliers=0;                             // 存储迭代过程中得到的内点个数// Step 1 如果匹配点比要求的最少内点数还少,不满足Sim3 求解条件,返回空// mRansacMinInliers 表示RANSAC所需要的最少内点数目if(N<mRansacMinInliers){bNoMore = true;  // 表示求解失败return cv::Mat();   }// 可以使用的点对的索引,为了避免重复使用vector<size_t> vAvailableIndices;// 随机选择的来自于这两个帧的三对匹配点cv::Mat P3Dc1i(3,3,CV_32F);cv::Mat P3Dc2i(3,3,CV_32F);// nCurrentIterations:     当前迭代的次数// nIterations:            理论迭代次数// mnIterations:           总迭代次数// mRansacMaxIts:          最大迭代次数int nCurrentIterations = 0;// Step 2 随机选择三个点,用于求解后面的Sim3// 条件1: 已经进行的总迭代次数还没有超过限制的最大总迭代次数// 条件2: 当前迭代次数还没有超过理论迭代次数while(mnIterations<mRansacMaxIts && nCurrentIterations<nIterations){nCurrentIterations++;// 这个函数中迭代的次数mnIterations++;      // 总的迭代次数,默认为最大为300// 记录所有有效(可以采样)的候选三维点索引vAvailableIndices = mvAllIndices;// Get min set of points// Step 2.1 随机取三组点,取完后从候选索引中删掉for(short i = 0; i < 3; ++i){// DBoW3中的随机数生成函数int randi = DUtils::Random::RandomInt(0, vAvailableIndices.size()-1);int idx = vAvailableIndices[randi];// P3Dc1i和P3Dc2i中点的排列顺序:// x1 x2 x3 ...// y1 y2 y3 ...// z1 z2 z3 ...mvX3Dc1[idx].copyTo(P3Dc1i.col(i));mvX3Dc2[idx].copyTo(P3Dc2i.col(i));// 从"可用索引列表"中删除这个点的索引 vAvailableIndices[randi] = vAvailableIndices.back();vAvailableIndices.pop_back();}// Step 2.2 根据随机取的两组匹配的3D点,计算P3Dc2i 到 P3Dc1i 的Sim3变换ComputeSim3(P3Dc1i,P3Dc2i);// Step 2.3 对计算的Sim3变换,通过投影误差进行inlier检测CheckInliers();// Step 2.4 记录并更新最多的内点数目及对应的参数if(mnInliersi>=mnBestInliers){mvbBestInliers = mvbInliersi;mnBestInliers = mnInliersi;mBestT12 = mT12i.clone();mBestRotation = mR12i.clone();mBestTranslation = mt12i.clone();mBestScale = ms12i;if(mnInliersi>mRansacMinInliers) // 只要计算得到一次合格的Sim变换,就直接返回{// 返回值,告知得到的内点数目nInliers = mnInliersi;for(int i=0; i<N; i++)if(mvbInliersi[i])// 标记为内点vbInliers[mvnIndices1[i]] = true;return mBestT12;} // 如果当前次迭代已经合格了,直接返回} // 更新最多的内点数目} // 迭代循环// Step 3 如果已经达到了最大迭代次数了还没得到满足条件的Sim3,说明失败了,放弃,返回if(mnIterations>=mRansacMaxIts)bNoMore=true;return cv::Mat();   // no more的时候返回的是一个空矩阵
}

未完待续

软件工程应用与实践第七篇相关推荐

  1. 软件工程应用与实践第八篇

    ORB-SLAM3 Pinhole.cpp相关代码理解与分析 2021SC@SDUSC 文章目录 ORB-SLAM3 Pinhole.cpp相关代码理解与分析 前言 一.ORB-SLAM3中的相机模型 ...

  2. 山东大学软件工程应用与实践——GMSSL开源库(四)——SM9数字签名算法及验证的源代码分析

    2021SC@SDUSC 目录 一.引言 二.密钥的生成数字签名与签名验证相关代码 1.判定函数 2.签名的初始化函数 3.签名执行函数 4.真正的签名函数 5.签名验证初始化函数 6.签名验证执行函 ...

  3. 软件工程应用与实践(15)——请求与响应

    2021SC@SDUSC 文章目录 一.概述 二.源码分析 2.1 响应 2.2 请求 三.总结 一.概述 在老年健康知识图谱系统中,后端与前端的交互是很重要的,在前端向后端发送请求的过程中,后端需要 ...

  4. 山东大学软件工程应用与实践——使用CUDA/GPU技术加速密码运算(第七周)

    2021SC@SDUSC 本周对于国密SM2算法原理进行简要的介绍,方便后续对其在CUDA上进行设计. 一.SM2加解密过程 SM2 国密非对称加密算法,属于椭圆曲线密码体制(ECC) Author: ...

  5. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(七)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型 学习论文: <ProtTrans: Towards Cracking the Language of Life' ...

  6. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--quark renderer代码分析 第十二篇 绘画系统分析(3):连线(line)

    2021SC@SDUSC 这是绘画系统的第三个大部分,连线,连线的内容包括最上层的链接线抽象类,和细分的直线,折线,贝塞尔曲线以及内外旋轮曲线五个部分. 首先是连接线抽象类. 连接线抽象类,需要成为连 ...

  7. 山东大学软件工程应用与实践——WeaselTSF(一)

    2021SC@SDUSC 文章目录 简单介绍 WeaselTSF.h 从本篇博客开始分析WeaselTFS这个包中的代码. 简单介绍 WeaselTSF.vcproj This is the main ...

  8. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--YOLOV5代码分析(十三)metrics.py-1

    2021SC@SDUSC 前言 这篇分析metrics.py文件,这个文件是用来计算评估指标,包括mAP.混淆矩阵.IOU相关的函数. fitness函数 def fitness(x):# Model ...

  9. <2021SC@SDUSC>博客(5)山东大学软件工程应用与实践JPress代码分析(四)

    2021SC@SDUSC 前言 在前面三篇文章中,我对 JPress 项目的基础框架 JFinal 和 JBoot 在使用层面进行了拆解与分析.在接下来的文章中,我将在代码层面对 JPress 项目中 ...

最新文章

  1. 非线性滤波(opencv)
  2. BZOJ2831(小强的金字塔系列问题--区域整点数求法)
  3. JMeter java.net.URISyntaxException:Illegalcharacterinquery解决方案
  4. 什么是Memcache
  5. 全称是什么_JDK,JRE和JVM是什么?三者有什么关系?二分钟搞定!!!
  6. hazelcast入门教程_Hazelcast入门指南第4部分
  7. 28335scififo中断接收与发送
  8. 操作系统学习之windows发展史
  9. excel文件分割器
  10. 如何破解自如的反爬机制
  11. Akm函数递归和非递归
  12. pvpgn mysql d2gs_pvpgn战网命令集
  13. 考虑储能削峰填谷的含DG配电网可靠性评估
  14. Discuz提速优化技巧
  15. docker容器Linux环境下二维码图片中文字体乱码处理办法
  16. 计算机老师发展的现状,计算机专业教师队伍的现状分析.doc
  17. 关于时间time和datetime
  18. ECE、UDC、EUDC、NEDC、FTP75工况的解释和区别
  19. 三层交换与路由器之间连接配置
  20. 2021年美容师(中级)报名考试及美容师(中级)新版试题

热门文章

  1. 老子的软件之道 - 道篇 5 企业管理
  2. select......for update会锁表还是锁行
  3. 鸿蒙应用开发教程第15期:弹框组件教学!
  4. 代理记帐多少钱,代理记账公司收费标准
  5. html自动读取excel文件内容吗,用插件实现html直接读取excel
  6. Java的六种线程状态
  7. Pycharm自动部署项目
  8. 华为安全专家带你入门安全多方计算
  9. 用java实现简单的图像处理基础篇之像素点数据的移位计算
  10. npm 配置双因素身份验证