软件工程应用与实践第七篇
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的时候返回的是一个空矩阵
}
未完待续
软件工程应用与实践第七篇相关推荐
- 软件工程应用与实践第八篇
ORB-SLAM3 Pinhole.cpp相关代码理解与分析 2021SC@SDUSC 文章目录 ORB-SLAM3 Pinhole.cpp相关代码理解与分析 前言 一.ORB-SLAM3中的相机模型 ...
- 山东大学软件工程应用与实践——GMSSL开源库(四)——SM9数字签名算法及验证的源代码分析
2021SC@SDUSC 目录 一.引言 二.密钥的生成数字签名与签名验证相关代码 1.判定函数 2.签名的初始化函数 3.签名执行函数 4.真正的签名函数 5.签名验证初始化函数 6.签名验证执行函 ...
- 软件工程应用与实践(15)——请求与响应
2021SC@SDUSC 文章目录 一.概述 二.源码分析 2.1 响应 2.2 请求 三.总结 一.概述 在老年健康知识图谱系统中,后端与前端的交互是很重要的,在前端向后端发送请求的过程中,后端需要 ...
- 山东大学软件工程应用与实践——使用CUDA/GPU技术加速密码运算(第七周)
2021SC@SDUSC 本周对于国密SM2算法原理进行简要的介绍,方便后续对其在CUDA上进行设计. 一.SM2加解密过程 SM2 国密非对称加密算法,属于椭圆曲线密码体制(ECC) Author: ...
- 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(七)
2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型 学习论文: <ProtTrans: Towards Cracking the Language of Life' ...
- 2021SC@SDUSC山东大学软件学院软件工程应用与实践--quark renderer代码分析 第十二篇 绘画系统分析(3):连线(line)
2021SC@SDUSC 这是绘画系统的第三个大部分,连线,连线的内容包括最上层的链接线抽象类,和细分的直线,折线,贝塞尔曲线以及内外旋轮曲线五个部分. 首先是连接线抽象类. 连接线抽象类,需要成为连 ...
- 山东大学软件工程应用与实践——WeaselTSF(一)
2021SC@SDUSC 文章目录 简单介绍 WeaselTSF.h 从本篇博客开始分析WeaselTFS这个包中的代码. 简单介绍 WeaselTSF.vcproj This is the main ...
- 2021SC@SDUSC山东大学软件学院软件工程应用与实践--YOLOV5代码分析(十三)metrics.py-1
2021SC@SDUSC 前言 这篇分析metrics.py文件,这个文件是用来计算评估指标,包括mAP.混淆矩阵.IOU相关的函数. fitness函数 def fitness(x):# Model ...
- <2021SC@SDUSC>博客(5)山东大学软件工程应用与实践JPress代码分析(四)
2021SC@SDUSC 前言 在前面三篇文章中,我对 JPress 项目的基础框架 JFinal 和 JBoot 在使用层面进行了拆解与分析.在接下来的文章中,我将在代码层面对 JPress 项目中 ...
最新文章
- 非线性滤波(opencv)
- BZOJ2831(小强的金字塔系列问题--区域整点数求法)
- JMeter java.net.URISyntaxException:Illegalcharacterinquery解决方案
- 什么是Memcache
- 全称是什么_JDK,JRE和JVM是什么?三者有什么关系?二分钟搞定!!!
- hazelcast入门教程_Hazelcast入门指南第4部分
- 28335scififo中断接收与发送
- 操作系统学习之windows发展史
- excel文件分割器
- 如何破解自如的反爬机制
- Akm函数递归和非递归
- pvpgn mysql d2gs_pvpgn战网命令集
- 考虑储能削峰填谷的含DG配电网可靠性评估
- Discuz提速优化技巧
- docker容器Linux环境下二维码图片中文字体乱码处理办法
- 计算机老师发展的现状,计算机专业教师队伍的现状分析.doc
- 关于时间time和datetime
- ECE、UDC、EUDC、NEDC、FTP75工况的解释和区别
- 三层交换与路由器之间连接配置
- 2021年美容师(中级)报名考试及美容师(中级)新版试题