补充SystemSetting和InitKeyFrame两个类的代码。实际上,由于是通过SystemSetting来读取的相机内参以及ORB特征参数,所以就可以将Tracking.cc中关于读取内参的部分替换掉了。

1. SystemSetting.h

#ifndef SYSTEMSETTING_H
#define SYSTEMSETTING_H #include <string>
#include "ORBVocabulary.h"
#include<opencv2/core/core.hpp> namespace ORB_SLAM2 { class SystemSetting{ //Load camera parameters from setting file
public: SystemSetting(ORBVocabulary* pVoc);
//SystemSetting::SystemSetting(ORBVocabulary* pVoc, KeyFrameDatabase* pKFDB ); bool LoadSystemSetting(const std::string strSettingPath); public:
//The Vocabulary and KeyFrameDatabase
ORBVocabulary* pVocabulary;
//KeyFrameDatabase* pKeyFrameDatabase; //Camera parameters
float width;
float height;
float fx;
float fy;
float cx;
float cy;
float invfx;
float invfy;
float bf;
float b;
float fps;
cv::Mat K;
cv::Mat DistCoef;
bool initialized; //Camera RGB parameters
int nRGB; //ORB feature parameters
int nFeatures;
float fScaleFactor;
int nLevels;
float fIniThFAST;
float fMinThFAST; //other parameters
float ThDepth = -;
float DepthMapFactor = -; }; } //namespace ORB_SLAM2 #endif //SystemSetting

2. SystemSetting.cc

#include <iostream>

#include "SystemSetting.h"

using namespace std;

namespace ORB_SLAM2 {

    SystemSetting::SystemSetting(ORBVocabulary* pVoc):
pVocabulary(pVoc)
{
} //SystemSetting::SystemSetting(ORBVocabulary* pVoc, KeyFrameDatabase* pKFDB):
// pVocabulary(pVoc), pKeyFrameDatabase(pKFDB)
// {
// } bool SystemSetting::LoadSystemSetting(const std::string strSettingPath){
cout<<endl<<"Loading System Parameters form:"<<strSettingPath<<endl;
cv::FileStorage fSettings(strSettingPath, cv::FileStorage::READ);
width = fSettings["Camera.width"];
height = fSettings["Camera.height"];
fx = fSettings["Camera.fx"];
fy = fSettings["Camera.fy"];
cx = fSettings["Camera.cx"];
cy = fSettings["Camera.cy"]; cv::Mat tmpK = cv::Mat::eye(,,CV_32F);
tmpK.at<float>(,) = fx;
tmpK.at<float>(,) = fy;
tmpK.at<float>(,) = cx;
tmpK.at<float>(,) = cy;
tmpK.copyTo(K); cv::Mat tmpDistCoef(,,CV_32F);
tmpDistCoef.at<float>() = fSettings["Camera.k1"];
tmpDistCoef.at<float>() = fSettings["Camera.k2"];
tmpDistCoef.at<float>() = fSettings["Camera.p1"];
tmpDistCoef.at<float>() = fSettings["Camera.p2"];
const float k3 = fSettings["Camera.k3"];
if( k3!= )
{
tmpDistCoef.resize();
tmpDistCoef.at<float>() = k3;
}
tmpDistCoef.copyTo( DistCoef ); bf = fSettings["Camera.bf"];
fps= fSettings["Camera.fps"]; invfx = 1.0f/fx;
invfy = 1.0f/fy;
b = bf /fx;
initialized = true; cout<<"- size:"<<width<<"x"<<height<<endl;
cout<<"- fx:" <<fx<<endl;
cout << "- fy: " << fy << endl;
cout << "- cx: " << cx << endl;
cout << "- cy: " << cy << endl;
cout << "- k1: " << DistCoef.at<float>() << endl;
cout << "- k2: " << DistCoef.at<float>() << endl;
if(DistCoef.rows==)
cout << "- k3: " << DistCoef.at<float>() << endl;
cout << "- p1: " << DistCoef.at<float>() << endl;
cout << "- p2: " << DistCoef.at<float>() << endl;
cout << "- bf: " << bf << endl; //Load RGB parameter
nRGB = fSettings["Camera.RGB"]; //Load ORB feature parameters
nFeatures = fSettings["ORBextractor.nFeatures"];
fScaleFactor = fSettings["ORBextractor.scaleFactor"];
nLevels = fSettings["ORBextractor.nLevels"];
fIniThFAST = fSettings["ORBextractor.iniThFAST"];
fMinThFAST = fSettings["ORBextractor.minThFAST"]; cout << endl << "ORB Extractor Parameters: " << endl;
cout << "- Number of Features: " << nFeatures << endl;
cout << "- Scale Levels: " << nLevels << endl;
cout << "- Scale Factor: " << fScaleFactor << endl;
cout << "- Initial Fast Threshold: " << fIniThFAST << endl;
cout << "- Minimum Fast Threshold: " << fMinThFAST << endl; //Load others parameters, if the sensor is MONOCULAR, the parameters is zero;
//ThDepth = fSettings["ThDepth"];
//DepthMapFactor = fSettings["DepthMapFactor"];
fSettings.release();
return true;
} }

3. InitKeyFrame.h

#ifndef INITKEYFRAME_H
#define INITKEYFRAME_H #include "Thirdparty/DBoW2/DBoW2/BowVector.h"
#include "Thirdparty/DBoW2/DBoW2/FeatureVector.h"
#include "SystemSetting.h"
#include <opencv2/opencv.hpp>
#include "ORBVocabulary.h"
#include "KeyFrameDatabase.h"
//#include "MapPoints.h" namespace ORB_SLAM2
{ #define FRAME_GRID_ROWS 48
#define FRAME_GRID_COLS 64 class SystemSetting;
class KeyFrameDatabase;
//class ORBVocabulary; class InitKeyFrame
{
public:
InitKeyFrame(SystemSetting &SS); void UndistortKeyPoints();
bool PosInGrid(const cv::KeyPoint& kp, int &posX, int &posY);
void AssignFeaturesToGrid(); public: ORBVocabulary* pVocabulary;
//KeyFrameDatabase* pKeyFrameDatabase; long unsigned int nId;
double TimeStamp; float fGridElementWidthInv;
float fGridElementHeightInv;
std::vector<std::size_t> vGrid[FRAME_GRID_COLS][FRAME_GRID_ROWS]; float fx;
float fy;
float cx;
float cy;
float invfx;
float invfy;
float bf;
float b;
float ThDepth;
int N;
std::vector<cv::KeyPoint> vKps;
std::vector<cv::KeyPoint> vKpsUn;
cv::Mat Descriptors; //it's zero for mono
std::vector<float> vRight;
std::vector<float> vDepth; DBoW2::BowVector BowVec;
DBoW2::FeatureVector FeatVec; int nScaleLevels;
float fScaleFactor;
float fLogScaleFactor;
std::vector<float> vScaleFactors;
std::vector<float> vLevelSigma2;
std::vector<float> vInvLevelSigma2;
std::vector<float> vInvScaleFactors; int nMinX;
int nMinY;
int nMaxX;
int nMaxY;
cv::Mat K;
cv::Mat DistCoef; }; } //namespace ORB_SLAM2
#endif //INITKEYFRAME_H

4. InitKeyFrame.cc

#include "InitKeyFrame.h"
#include <opencv2/opencv.hpp>
#include "SystemSetting.h" namespace ORB_SLAM2
{ InitKeyFrame::InitKeyFrame(SystemSetting &SS):pVocabulary(SS.pVocabulary)//, pKeyFrameDatabase(SS.pKeyFrameDatabase)
{
fx = SS.fx;
fy = SS.fy;
cx = SS.cx;
cy = SS.cy;
invfx = SS.invfx;
invfy = SS.invfy;
bf = SS.bf;
b = SS.b;
ThDepth = SS.ThDepth; nScaleLevels = SS.nLevels;
fScaleFactor = SS.fScaleFactor;
fLogScaleFactor = log(SS.fScaleFactor);
vScaleFactors.resize(nScaleLevels);
vLevelSigma2.resize(nScaleLevels);
vScaleFactors[] = 1.0f;
vLevelSigma2[] = 1.0f;
for ( int i = ; i < nScaleLevels; i ++ )
{
vScaleFactors[i] = vScaleFactors[i-]*fScaleFactor;
vLevelSigma2[i] = vScaleFactors[i]*vScaleFactors[i];
} vInvScaleFactors.resize(nScaleLevels);
vInvLevelSigma2.resize(nScaleLevels);
for ( int i = ; i < nScaleLevels; i ++ )
{
vInvScaleFactors[i] = 1.0f/vScaleFactors[i];
vInvLevelSigma2[i] = 1.0f/vLevelSigma2[i];
} K = SS.K; DistCoef = SS.DistCoef; if( SS.DistCoef.at<float>()!=0.0)
{
cv::Mat mat(,,CV_32F);
mat.at<float>(,) = 0.0;
mat.at<float>(,) = 0.0;
mat.at<float>(,) = SS.width;
mat.at<float>(,) = 0.0;
mat.at<float>(,) = 0.0;
mat.at<float>(,) = SS.height;
mat.at<float>(,) = SS.width;
mat.at<float>(,) = SS.height; mat = mat.reshape();
cv::undistortPoints(mat, mat, SS.K, SS.DistCoef, cv::Mat(), SS.K);
mat = mat.reshape(); nMinX = min(mat.at<float>(,), mat.at<float>(,));
nMaxX = max(mat.at<float>(,), mat.at<float>(,));
nMinY = min(mat.at<float>(,), mat.at<float>(,));
nMaxY = max(mat.at<float>(,), mat.at<float>(,));
}
else
{
nMinX = 0.0f;
nMaxX = SS.width;
nMinY = 0.0f;
nMaxY = SS.height;
} fGridElementWidthInv=static_cast<float>(FRAME_GRID_COLS)/(nMaxX-nMinX);
fGridElementHeightInv=static_cast<float>(FRAME_GRID_ROWS)/(nMaxY-nMinY); } void InitKeyFrame::UndistortKeyPoints()
{
if( DistCoef.at<float>() == 0.0)
{
vKpsUn = vKps;
return;
} cv::Mat mat(N,,CV_32F);
for ( int i = ; i < N; i ++ )
{
mat.at<float>(i,) = vKps[i].pt.x;
mat.at<float>(i,) = vKps[i].pt.y;
} mat = mat.reshape();
cv::undistortPoints(mat, mat, K, DistCoef, cv::Mat(), K );
mat = mat.reshape(); vKpsUn.resize(N);
for( int i = ; i < N; i ++ )
{
cv::KeyPoint kp = vKps[i];
kp.pt.x = mat.at<float>(i,);
kp.pt.y = mat.at<float>(i,);
vKpsUn[i] = kp;
}
} void InitKeyFrame::AssignFeaturesToGrid()
{
int nReserve = 0.5f*N/(FRAME_GRID_COLS*FRAME_GRID_ROWS);
for ( unsigned int i = ; i < FRAME_GRID_COLS; i ++ )
{
for ( unsigned int j = ; j < FRAME_GRID_ROWS; j ++)
vGrid[i][j].reserve(nReserve);
} for ( int i = ; i < N; i ++ )
{
const cv::KeyPoint& kp = vKpsUn[i];
int nGridPosX, nGridPosY;
if( PosInGrid(kp, nGridPosX, nGridPosY))
vGrid[nGridPosX][nGridPosY].push_back(i);
}
} bool InitKeyFrame::PosInGrid(const cv::KeyPoint &kp, int &posX, int &posY)
{
posX = round((kp.pt.x-nMinX)*fGridElementWidthInv);
posY = round((kp.pt.y-nMinY)*fGridElementHeightInv); if(posX< || posX>=FRAME_GRID_COLS ||posY< || posY>=FRAME_GRID_ROWS)
return false;
return true;
} }

ORB-SLAM2 地图加载2的更多相关文章

  1. ORB-SLAM2 地图加载

    一.前面说了ORB-SLAM地图的保存部分,继续说地图如何加载,因为加载部分相比保存要稍微复杂一些,所以要多说一点. 二.ORB-SLAM2地图加载构成 首先同样是在头文件中声明加载函数,包含地图点和 ...

  2. AMap地图加载完成事件

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. Openlayers+Geoserver(一):项目介绍以及地图加载

           项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...

  4. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题

    原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...

  5. Android高清巨图加载方案

    1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...

  6. arcgis 瓦片图加载规则(转载)

    arcgis 瓦片图加载规则 最近需要做地图离线的功能,要能下载指定区域的瓦片图,我们都知道如何加载谷歌和天地图的加载规则,但是网上貌似没有找到如何加载arcgis自己发布的瓦片图规则,好不容易找到一 ...

  7. Leaflet+heatmap实现离线地图加载和热力图应用

    本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...

  8. arcgis api 3.x for js 地图加载多个 SHP 图层压缩以及 json 文件展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. 微软必应地图加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor

    微软必应地图在chrome浏览器加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor, 原因是没有等待地图API加 ...

  10. orb slam2 双目摄像头

    主要参考了http://blog.csdn.net/awww797877/article/details/51171099这篇文章,其中需要添加的是:export ROS_PACKAGE_PATH=$ ...

随机推荐

  1. webpack打包优化实践

    事情缘由 近段时间在做基于scratch3.0的改造项目.基于scratch-gui改造,项目本身已经很大了,然后里面还要用到scratch-blocks,scratch-vm,scratch-ren ...

  2. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  3. 使用Runtime的hook技术为tableView实现一个空白缺省页

    一.介绍 UITableView和UICollectionView是iOS开发最常用的控件,也是必不可少的控件,这两个控件基本能实现各种各样的界面样式. 它们都是通过代理模式监测数据源的有无对数据进行 ...

  4. Mac下vim安装taglist

    1 安装taglist taglist 的安装非常简单.从vim官网的这个链接 http://www.vim.org/scripts/script.php?script_id=273,就可以下载到ta ...

  5. 常用的app包名和类名

    应用 包名 启动类 QQ com.tencent.mobileqq com.tencent.mobileqq.activity.HomeActivity 微信 com.tencent.mm com.t ...

  6. 正则表达式中的.*?和python中re.S参数的详解

    本章的内容主要是为讲解在正则表达式中常用的.*?和re.S! 在正则表达式中有贪婪匹配和最小匹配:如下为贪婪匹配(.*) import re match = re.search(r'PY.*', 'P ...

  7. 帝国CMS系统目录结构介绍

    帝国CMS目录结构介绍 / 系统根目录├d/            附件和数据存放目录 (data)│├file/       附件存放目录│├js/         JS调用生成目录│└txt/   ...

  8. C++ 运算符重载的基本概念

    01 运算符重载的需求 C++ 预定义的运算符,只能用于基本数据类型的运算:整型.实型.字符型.逻辑型等等,且不能用于对象的运算.但是我们有时候又很需要在对象之间能用运算符,那么这时我们就要重载运算符 ...

  9. Clean Code

    书名<代码整洁之道>        命名    有意义的命名,使人能读懂    类名和对象名应该是名称或名称短语    方法名应该是动词或动词短语 函数    短小,函数块不要超过一个屏幕 ...

  10. Node.js提供了哪些内容(API)

    Nodejs运行时,JavaScript代码运行时的环境. 提供了一些核心模块,应用程序编程接口(Application Program Interface,API)  API 的意思就是.一个已经解 ...