补充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. csrf攻击与csrf防御

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  2. Distilling the Knowledge in a Neural Network

    url: https://arxiv.org/abs/1503.02531 year: NIPS 2014   简介 将大模型的泛化能力转移到小模型的一种显而易见的方法是使用由大模型产生的类概率作 ...

  3. NumPy 学习 第四篇:数组的基本操作

    在数组中,用axis(轴)表示维度,对于三维数组,axis参数的取值通常有: 当axis=None时,表示把数组展开为一维数组: 当axis=0时,表示按照行(第一维)进行计算: 当axis=1时,表 ...

  4. 湖南省web应用软件(中慧杯)

    湖南省web应用软件 写这篇博客已经是比完赛的第四天了,我还记得那天下着小雨.我们早早的到了比赛的现场抽检机器,在比赛前一天我很是激动.我还记得我们从学校,去株洲的时候我们的领导来给我加油,特别是我的 ...

  5. python基础(29):网络编程(软件开发架构、网络基础、套接字初使用)

    1. 软件开发架构 我们了解的程序之间通讯的应用可分为两种: 第一种是应用类:qq.微信.百度网盘.腾讯视频这一类是属于需要安装的桌面应用. 第二种是web类:比如百度.知乎.博客园等使用浏览器访问就 ...

  6. Python使用数字与字符串的技巧

    1.少写数字字面量 "数字字面量(integer literal)" 是指那些直接出现在代码里的数字.它们分布在代码里的各个角落,比如代码 del users[0] 里的 0 就是 ...

  7. Python笔记:设计模式之代理模式

    代理通常就是一个介于寻求方和提供方之间的中介系统.其核心思想就是客户端(寻求方)没有直接和提供方(真实对象)打交道,而是通过代理对象来完成提供方提供的资源或操作. 代理其实就是封装实际服务对象的包装器 ...

  8. python凯撒加密

    在密码学中,恺撒密码是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例,当偏移量是3的时候,所有的字母A将 ...

  9. 初始HTML_二

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...

  10. ABP进阶教程7 - 功能按钮

    点这里进入ABP进阶教程目录 下载插件 打开Datatables官网(https://datatables.net/download/) 勾选Extensions/Buttons,下载插件,复制到JD ...