ORBSLAM2
ningxiner2016
这个作者很懒,什么都没留下…
展开
-
31局部建图线程剔除关键帧
ORBSLAM231局部建图线程剔除关键帧ORBSLAM2代码代码void LocalMapping::KeyFrameCulling(){ // Check redundant keyframes (only local keyframes) // A keyframe is considered redundant if the 90% of the MapPoints it sees, are seen // in at least other 3 keyfr原创 2021-04-01 19:38:24 · 226 阅读 · 0 评论 -
30局部建图线程中的localBA
ORBSLAM230局部建图线程中的localBAORBSLAM2原创 2021-04-01 19:05:19 · 328 阅读 · 0 评论 -
29局部建图线程两级局部关键帧地图点融合
ORBSLAM229局部建图线程两级局部关键帧地图点融合ORBSLAM2代码代码void LocalMapping::SearchInNeighbors(){ // Retrieve neighbor keyframes int nn = 10; if(mbMonocular) nn=20; const vector<KeyFrame*> vpNeighKFs = mpCurrentKeyFrame->GetBestCovi原创 2021-03-31 19:37:23 · 227 阅读 · 0 评论 -
27 局部建图线程处理新关键帧、检查删除地图点、关键帧之间生成新的地图点
ORBSLAM227 局部建图线程处理新关键帧、检查删除地图点、关键帧之间生成新的地图点ORBSLAM2代码代码线程主函数在localmappin.cc中的run()函数中,与tracking线程是并行的void LocalMapping::Run(){ mbFinished = false;//标记函数,表示该线程没有结束,正在运行 while(1)//开始进行循环 { // Tracking will see that Local Mapp原创 2021-03-31 11:09:06 · 308 阅读 · 0 评论 -
25关键帧定义应用与选择方法、创建及插入关键帧
ORBSLAM225关键帧定义应用与选择方法、创建及插入关键帧ORBSLAM2关键帧为什么需要关键帧代码关键帧什么是关键帧?通俗来说,关键帧就是几帧普通帧里面具有代表性的一帧。为什么需要关键帧1.相近帧之间信息冗余度很高,关键帧是取局部相近帧中最有代表性的一帧,可以降低信息冗余度。2.关键帧选择时还会对图片质量、特征点质量等进行考察,在Bundle Fusion、RKD SLAM等RGB-D-SLAM相关方案中常常用普通帧的深度投影到关键帧上进行深度图优化,一定程度上关键帧是普通帧滤原创 2021-03-30 20:05:11 · 2095 阅读 · 0 评论 -
23局部地图跟踪创建局部关键帧与地图点
ORBSLAM2@[TOC](23局部地图跟踪创建局部关键帧与地图点)代码前面几部分是基于关键帧跟踪、重定位跟踪、基于恒速模型跟踪,只用到当前帧或几个关键帧,比较粗糙。而局部地图跟踪比较准确,它的前提是必须知道当前帧的位姿与地图点,让位姿更准确(有点后端的味道)。void Tracking::UpdateLocalMap(){ // This is for visualization mpMap->SetReferenceMapPoints(mvpLocalMapP原创 2021-03-30 15:09:21 · 482 阅读 · 0 评论 -
22跟踪丢失后重定位
ORBSLAM222跟踪丢失后重定位ORBSLAM2代码代码bool Tracking::Relocalization(){ // Compute Bag of Words Vector mCurrentFrame.ComputeBoW();//计算当前帧的词袋模型 // Relocalization is performed when tracking is lost // Track Lost: Query KeyFrame Database for原创 2021-03-30 11:23:05 · 397 阅读 · 0 评论 -
21基于恒速模型跟踪当前帧
ORBSLAM221基于恒速模型跟踪当前帧ORBSLAM2代码代码bool Tracking::TrackWithMotionModel(){ ORBmatcher matcher(0.9,true);//最优距离小于0.9*次优距离,并检查旋转 // Update last frame pose according to its reference keyframe // Create "visual odometry" points if in Localiz原创 2021-03-29 22:27:30 · 437 阅读 · 0 评论 -
20-参考关键帧跟踪当前普通帧,仅位姿优化
ORB-SLAM220-参考关键帧跟踪当前普通帧,仅位姿优化ORB-SLAM2原创 2021-03-29 19:53:38 · 497 阅读 · 0 评论 -
g2o学习
g2o学习g2o是slam中常用的一种优化库,在视觉slam中主要用来优化位姿与3D点的。它主要分为以下几个步骤:1.定义一个求解器2.定义优化顶点3.定义优化边它的基本框架基本在下面的图中:注意箭头的方向以及箭头的含义。构建求解器在求解器中最终的目标是构建一个SparseOptimizer稀疏优化器。typedef g2o::BlockSolver<g2o::BlockSolverTraits<3,1>> Block;//1.构建线性求解器Block::原创 2021-03-29 14:34:03 · 237 阅读 · 0 评论 -
19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe
ORBSLAM2ORB-SLAM离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVeORBSLAM2代码代码bool Tracking::TrackReferenceKeyFrame(){ // Compute Bag of Words vector mCurrentFrame.ComputeBoW();//如果词袋没有计算,需要计算计算词袋ComputeBow()void KeyFrame::ComputeBoW(){ if(mBow原创 2021-03-28 19:16:08 · 368 阅读 · 0 评论 -
18-词袋模型
ORBSLAM2提示:ORB-SLAM2词袋模型ORBSLAM2词袋模型应用词袋模型流程1.提取特征点2.对特征点描述子进行聚类,得到词袋树3.新来的一帧进行词袋遍历,得到单词,然后用频率表示词袋模型中只考虑它出现的频率。应用1.闭环检测主要就是判断图像的相似性,用帧差法缺点很多。容易受到光照、角度等影响。而词袋只关心有没有这些words以及出现了多少次。2.加速匹配缺点:需要提前训练好词袋,增加存储空间,加载较慢。但瑕不掩瑜。...原创 2021-03-28 14:45:00 · 866 阅读 · 0 评论 -
初始化关键帧更新共视关系,尺度归一化
ORB-SLAM2ORB-SLAM2初始化关键帧更新共视关系,尺度归一化ORB-SLAM2代码代码// Update Connections更新初始帧与当前帧的连接关系,3D点 与关键帧建立边,每个边有一个权重,权重是该关键帧与当前帧公共3D点的个数 pKFini->UpdateConnections(); pKFcur->UpdateConnections();进入UpdateConnectionsvoid KeyFrame::UpdateConnect原创 2021-03-28 14:25:01 · 328 阅读 · 0 评论 -
单目初始化从单应阵中恢复位姿、依据三角化检验位姿
ORB-SLAM2单目初始化从单应阵中恢复位姿、依据三角化检验位姿ORB-SLAM2代码代码//在完成评分后,开始使用单应矩阵或者基础阵进行位姿的恢复 if(RH>0.40)//在计算完评分后 选择利用那种方法来恢复位姿 return ReconstructH(vbMatchesInliersH,H,mK,R21,t21,vP3D,vbTriangulated,1.0,50); else //if(pF_HF>0.6) retur原创 2021-03-27 19:26:30 · 266 阅读 · 0 评论 -
卡方检验原理
ORB-SLAM2卡方检验原理ORB-SLAM2卡方检验用途步骤卡方检验某些情况在长时间进行实验,它的结果是稳定的,例如抛硬币。但是期望与实际情况是有一定差异的。利用卡方检验可以排除可疑结果(建模错误还是正常波动)。用途1.检查实际结果与期望结果之间何时存在显著差异。(1)检验拟合程度,也就是检验一组数据与指定分布的拟合程度(2)检验两个变量的独立性:检查变量之间是否存在联系’步骤1.确定要进行的检验假设与其备择假设2.求出期望E3.确定用于做决策的拒绝阈4.依据自由度原创 2021-03-27 19:06:17 · 1685 阅读 · 0 评论 -
单目初始化构建地图、计算地图点具有代表性的描述子、计算平均观测方向
ORB-SLAM2ORB-SLAM2-单目初始化构建地图、计算地图点具有代表性的描述子、计算平均观测方向ORB-SLAM2代码代码//在单目初始化计算位姿完成后,开始初始化构建地图 CreateInitialMapMonocular();进入这个函数中void Tracking::CreateInitialMapMonocular(){ // Create KeyFrames创建关键帧,在初始化的时候会认为当前帧与参考帧都是关键帧 KeyFr原创 2021-03-26 20:58:44 · 415 阅读 · 0 评论 -
单目初始化中从基础矩阵到最佳位姿及三维点
ORB-SLAM2ORB-SLAM2-单目初始化中从基础矩阵到最佳位姿及三维点ORB-SLAM2代码代码利用F矩阵来进行恢复,主要用于非平面return ReconstructF(vbMatchesInliersF,F,mK,R21,t21,vP3D,vbTriangulated,1.0,50);进入ReconstructF()函数bool Initializer::ReconstructF(vector<bool> &vbMatchesInliers, cv::原创 2021-03-26 16:15:10 · 268 阅读 · 0 评论 -
ORB-SLAM2 单目初始化中随机选择点集、归一化原理、求单应阵、基础阵
ORB-SLAM2ORB-SLAM2 单目初始化中随机选择点集、归一化原理、求单应阵ORB-SLAM2一、代码一、代码在特征点提取与匹配完成后,回到Tracking.cc中 if(nmatches<100)//判断,如果特征匹配的数目小于100的话 { delete mpInitializer;//那么就删除这个初始化器。重新开始初始化 mpInitializer = static_cast<Initialize原创 2021-03-24 18:52:57 · 573 阅读 · 1 评论 -
ORB-SLAM2-单目初始化中的特征点匹配
ORBSLAM2源码ORB-SLAM2-单目初始化中的特征点匹配ORBSLAM2源码一、代码一、代码在单目初始化完成后,下面就开始对单目初始化中的两帧进行匹配单目初始化中特征点的匹配函数在 SearchForInitialization()中;进入 SearchForInitialization()函数中//这个函数在ORBmatcher.cc这个文件中int ORBmatcher::(Frame &F1, Frame &F2, vector<cv原创 2021-03-23 20:47:53 · 344 阅读 · 0 评论 -
ORB-SLAM2-Brief描述子方向计算
ORB-SLAM2-Brief描述子方向计算代码代码在计算完特征点的方向后,开始计算描述子Mat descriptors;//首先定义了描述子 int nkeypoints = 0;//统计金字塔中所有特征点 for (int level = 0; level < nlevels; ++level)//开始遍历每一层图像金字塔,然后将每一层金字塔上特征点进行总和 nkeypoints += (int)allKeypoints[level].size();..原创 2021-03-18 11:22:20 · 524 阅读 · 0 评论 -
ORBSLAM2-灰度质心法求旋转不变性
ORBSLAM2-灰度质心法求旋转不变性代码代码当使用和四叉树的策略,将ORB特征点均匀的分布在在图像中后,接下来就需要进行计算方向,因为FAST角点与Brief描述子是不具备旋转不变性的,因此用灰度质心法计算旋转不变性。const int scaledPatchSize = PATCH_SIZE*mvScaleFactor[level];//定义每层patch_size的缩放,,这边就是在前面系统构造函数中所画的圆的直径,因为在图像金字塔中,每层的图像大小是不一样的,因此计算的圆的大小也是不一..原创 2021-03-18 09:53:12 · 1251 阅读 · 0 评论 -
ORBSLAM2-ORB的提取与均匀分布
ORBSLAM2-ORB的提取与均匀分布一.前言二.代码一.前言二.代码ORBextractor::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _keypoints, OutputArray _descriptors){ if(_image.empty()) return; Mat image = _ima..原创 2021-03-11 21:59:43 · 200 阅读 · 0 评论 -
ORBSLAM2代码2-图像金字塔
ORBSLAM2代码2,图像金字塔一.前言二.代码一.前言这一部分主要是对输入进来的图像进行构建图像金字塔,并且对每层图像的边缘进行填充,方便后续的特征点提取。图像帧Frame的构造函数还没完成。二.代码这部分代码在mono_um.cc中SLAM.TrackMonocular(im,tframe);进入TrackMonocular这个函数中,这个函数在system.cc中cv::Mat System::TrackMonocular(const cv::Mat &im, cons..原创 2021-03-11 19:05:19 · 562 阅读 · 0 评论