ORB-SLAM2 地图加载2
补充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的更多相关文章
- ORB-SLAM2 地图加载
一.前面说了ORB-SLAM地图的保存部分,继续说地图如何加载,因为加载部分相比保存要稍微复杂一些,所以要多说一点. 二.ORB-SLAM2地图加载构成 首先同样是在头文件中声明加载函数,包含地图点和 ...
- AMap地图加载完成事件
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- Openlayers+Geoserver(一):项目介绍以及地图加载
项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...
- ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题
原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...
- Android高清巨图加载方案
1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...
- arcgis 瓦片图加载规则(转载)
arcgis 瓦片图加载规则 最近需要做地图离线的功能,要能下载指定区域的瓦片图,我们都知道如何加载谷歌和天地图的加载规则,但是网上貌似没有找到如何加载arcgis自己发布的瓦片图规则,好不容易找到一 ...
- Leaflet+heatmap实现离线地图加载和热力图应用
本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...
- arcgis api 3.x for js 地图加载多个 SHP 图层压缩以及 json 文件展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 微软必应地图加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor
微软必应地图在chrome浏览器加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor, 原因是没有等待地图API加 ...
- orb slam2 双目摄像头
主要参考了http://blog.csdn.net/awww797877/article/details/51171099这篇文章,其中需要添加的是:export ROS_PACKAGE_PATH=$ ...
随机推荐
- LVS负载均衡实现双向热备
一.LVS1服务器配置 安装ipvsadm,keepalived [root@localhost ~]# yum -y install ipvsadm keepalived 配置keepalivedd ...
- python奇闻杂技
第一天 01 从计算机到程序设计语言 02 python环境配置 03 实例一:温度转换 04 python语法分析 第二天 01 深入理解python语言 02 实例二,python蟒蛇配置 03 ...
- pytorch_13-图像处理之skimage
之前程序使用的是PIL(Python image library),今天遇到了另一种图像处理包--skimage. skimage即scikit-image,PIL和Pillow只提供最基础的数字图像 ...
- 【zibbix自定义监控】zabbix服务自定义监控mysql的状态信息
由于mysql我安装在zabbix_server服务的主机上,所以下面操作在zabbix服务主机上进行,注意服务主机已经安装了监控服务 实现步骤: 1.修改 zabbix_agentd.conf,添加 ...
- 【Linux】LVM操作添加新硬盘
目录 1.查看当前硬盘及分区情况 2.初始化/dev/sdb为PV(physical volume) 3.PV加入至VG组. 4.创建lv 5.格式化逻辑分区 6.挂载硬盘/data 7.迁移zabb ...
- iota: Golang 中优雅的常量
阅读约 11 分钟 注:该文作者是 Katrina Owen,原文地址是 iota: Elegant Constants in Golang 有些概念有名字,并且有时候我们关注这些名字,甚至(特别)是 ...
- SQL server已经设置为单用户模式,还是无法做分离、属性设置等操作
https://www.cnblogs.com/xingyunqiu/p/10336938.html SQL server已经设置为单用户模式,Sql server还原失败数据库正在使用,无法获得对数 ...
- String replaceAll(String regex,String str)满足正则表达式的部分替换为给定内容
package seday02;/*** * String replaceAll(String regex,String str)* @author xingsir*/public class Rep ...
- JS基础语法---数组案例---9个练习
练习1:求数组中所有元素的和 var arr1 = [10, 20, 30, 40, 50]; var sum = 0; for (var i = 0; i < arr1.length; i++ ...
- echarts水球图编写
// 前提条件 需要引入这个插件<script src="./echarts-liquidfill.min.js"></script> // 代码 let ...