参考教程:在ORB_SLAM2中使用自己的视频_Lqcx-spec的博客-CSDN博客
Ubuntu20.04配置ORBSLAM2并运行(保姆级教程)_9527风先生的博客-CSDN博客_orbslam2运行
Ubuntu18.04 ORB_SLAM2的安装、配置、运行SLAM单目实例_君琴的博客-CSDN博客
安装ORB-SLAM2请看:Ubuntu20.04配置ORBSLAM2并运行(保姆级教程)_9527风先生的博客-CSDN博客_orbslam2运行
这里就不赘叙了。主要介绍一下利用自己的视频数据集跑ORB-SLAM2,所用的视频拍的是寝室内部。
1.新建bedroom.yaml
cd ORB_SLAM2
gedit bedroom.yaml//创建.yaml文件
在新建的文件中输入以下代码(如果使用手机拍摄的,那么下面的参数基本上不用改):
%YAML:1.0
#--------------------------------------------------------------------------------------------
# 相机参数,根据自己手机相机的参数调整
#--------------------------------------------------------------------------------------------
# 相机标定和失真参数(OpenCV)
Camera.fx: 500.0
Camera.fy: 500.0
Camera.cx: 320.0
Camera.cy: 240.0
Camera.k1: 0
Camera.k2: 0
Camera.p1: 0
Camera.p2: 0
Camera.k3: 0
# 相机每秒帧数
Camera.fps: 30.0
# 图像的颜色顺序 (0: BGR, 1: RGB. 如果图像是灰度图就忽略)
Camera.RGB: 0
#--------------------------------------------------------------------------------------------
# ORB 参数
#--------------------------------------------------------------------------------------------
# ORB Extractor: 每张图的特征点数量
ORBextractor.nFeatures: 1000
# ORB Extractor: 在比例金字塔的层次之间的比例因子
ORBextractor.scaleFactor: 1.2
# ORB Extractor: 刻度金字塔中的层数
ORBextractor.nLevels: 8
# ORB Extractor: 快速阈值
# 图像被划分在网格中。在每个网格中提取FAST,施加最小的响应。
# 如果没有检测到拐角,我们施加一个较低的值minThFAST
# 如果图像对比度低,可以降低这些值
ORBextractor.iniThFAST: 10
ORBextractor.minThFAST: 5
#--------------------------------------------------------------------------------------------
# Viewer 参数
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500
如下图所示:
2、新建bedroom.cpp
gedit bedroom.cpp
在新建的文件中输入下面的代码:
#include <opencv2/opencv.hpp>
#include "System.h"
#include <string>
#include <chrono> // for time stamp
#include <iostream>
using namespace std;
// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./bedroom.yaml";
string vocFile = "./Vocabulary/ORBvoc.txt";
// 视频文件
string videoFile = "./bedroom.mp4";
int main(int argc, char **argv) {
// 声明 ORB-SLAM2 系统
ORB_SLAM2::System SLAM(vocFile, parameterFile, ORB_SLAM2::System::MONOCULAR, true);
// 获取视频图像
cv::VideoCapture cap(videoFile); // change to 0 if you want to use USB camera.
// 记录系统时间
auto start = chrono::system_clock::now();
while (1) {
cv::Mat frame;
cap >> frame; // 读取相机数据
if ( frame.data == nullptr )
continue;
// rescale because image is too large
cv::Mat frame_resized;
cv::resize(frame, frame_resized, cv::Size(640,360));
auto now = chrono::system_clock::now();
auto timestamp = chrono::duration_cast<chrono::milliseconds>(now - start);
SLAM.TrackMonocular(frame_resized, double(timestamp.count())/1000.0);
cv::waitKey(30);
}
return 0;
}
如下图所示:
3、修改CMakeLists.txt
打开文件夹ORB_SLAM2里的CMakeLists.txt添加下面的代码
#生成调用bedroom.mp4 可执行文件
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
add_executable(bedroom bedroom.cpp)
target_link_libraries(bedroom ${PROJECT_NAME})
4、编译和运行
cd ORB_SLAM2
mkdir build
cd build
cmake ..
make -j
cd ..
./bedroom #(执行)这里填自己生成的可执行文件名称,就是add_executate里面的
这里记录一个小问题,也困扰我好久了。刚开始在输入代码mkdir build时,显示build文件已存在,起初不以为意,接着输入代码,在输入cmake ..时,出现了以下的问题:
根据第一个错误提示,找到相应的findEigen3文件,错误的大致意思是找不到findEigen3文件中第33行所对应的eigen。
(1)起初以为是Pangolin版本问题,尝试过把原有的Pangolin文件删了,重新下载0.5版本的,发现错误还在。
(2)然后又以为是Eigen版本的问题,因为之前下的是3.3.7版本的,于是删了,按照sudo apt-get install libeigen3-dev代码下载Eigen,随后简单的用网络上的数据集跑ORB-SLAM 2代码,刚开始装ORB-SLAM2时这是可以实现的,发现现在不行了,原因是找不到Eigen对应的文件夹,后来我又在http://eigen.tuxfamily.org中找到3.3.7版本的,重新编译安装。说明这也不是源头所在。
(3)后来在网上直接搜上述终端出现的问题,我按照《CMAKE编译ORB-SLAM2时,报错找不到Eigen3,报错Eigen3 found!之类错误(已解决)》这篇文章的方法,把eigen3.3.7文件夹中的findEigen3.cmake文件放到ORB-SLAM2文件夹的src中,然后在cmakelist.txt中添加代码,最后还是不行。
(4)后来我又参考文章《变异Pangolin时,出现错误the file failed to open for read /usr/include/eigen3/Eigen/src/Core/util/Macro.h,解决》,尝试对出现问题的findEigen3.cmake文件下手,尝试改变里面内容,但是这篇文章中的链接失效了,无法知道应该怎么改。参考了《Sopus库中FindEigen3.cmake内容详解笔记》这篇文章。
(4)最后,我对参考文章《在ORB_SLAM2中使用自己的视频》中的创建build文件夹感到疑惑,因为我按照代码提示,输入mkdir build时,终端会显示build文件已经存在,于是我试着利用rm 命令把orb-slam2中的build文件删掉,重新创建一个build文件。最后莫名其妙的成功了。