ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转)
转自:用ORB SLAM2跑自己的数据集 使用图片序列或摄像头或视频 实践篇_不二青衣的博客-CSDN博客_orbslam2运行自己的数据集
学习
做实验参考使用,侵权则删
用ORB SLAM2跑自己的图片序列数据集
首先,我们需要知道图片的采集时间,这个可以从采集的仪器(各种各样的)上得到图片与时间一一对应。小树的问题描述:现有数据集视频,首先使用激光SLAM跑出来了一个轨迹,该轨迹作为groundtruth,将相同的数据集用纯视觉SLAM方法跑一下,然后与groundtruth做对比评判误差。
第一步:制作rgb/目录并把图片信息放进去。我们知道ORB SLAM2的输入是图片,首先将视频处理成图片,在windows平台下使用默认视频播放器都是可以处理的,不需要写代码便可以完成,我们可以设置按照1,2,3,4,5…这样的顺序存放。我们的采集频率是30帧/s,那么也按照相关的设置即可,最终得到5147张图片。
图像重新命名 对应时间戳的信息(按照时间戳为名字为图片依次重命)
import os
import shutilfile_old = open("yuanlaimm.txt")
filename_old = []
for line in file_old.readlines():line = line.strip()filename_old.append(line)
file_old.close()
file_new = open("jianglai.txt")
filename_new = []
for line in file_new.readlines():line = line.strip()filename_new.append(line)
file_new.close()output_dir = "./rgb/"
if not os.path.exists(output_dir):os.mkdir(output_dir)for i in range(len(filename_old)):print("%s => %s" % (filename_old[i], filename_new[i]))shutil.copy(filename_old[i], os.path.join(output_dir, filename_new[i]))
........
6347 324330090
6348 324363423
6349 324396756
6350 324430089
.....
# color images
# file: 'rgbd_dataset_freiburg1_xyz.bag'
# timestamp filename
1305031102.175304 rgb/1305031102.175304.png
1305031102.211214 rgb/1305031102.211214.png
1305031102.243211 rgb/1305031102.243211.png
1305031102.275326 rgb/1305031102.275326.png
1305031102.311267 rgb/1305031102.311267.png
1305031102.343233 rgb/1305031102.343233.png
......
我们可以发现第一列就是我们在上一篇文章中对应的时间戳信息,第二列对应的是图片的路径(如果不清楚,先浏览一下上一篇文章哦),那么我们现在来写一个文件生成这个rgb.txt吧,小树提供C++代码:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>using namespace std;int main(int argc, char const *argv[])
{
string a="/home/w/Pictures/videotime.txt";
ifstream f(a);
string temp;
getline(f,temp);
ofstream ff("rgb.txt");
while( !f.eof() && !temp.empty())
{
istringstream line(temp);
string lie;
line >> lie;
line >>lie;
ff<<lie<<" "<<"rgb/"<<lie<<".png"<<"\n";
getline(f,temp);
}
return 0;
}
Camera.fx: 306.12388801
Camera.fy: 306.10328046
Camera.cx: 626.89620968
Camera.cy: 343.62712523Camera.k1: 0.0890022226
Camera.k2: 0.0006550354
Camera.p1: 0.0025311656
Camera.p2: -0.001790449
Camera.k3: 0
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt /home/w/Documents/left.yaml /home/w/Pictures/leftCam0411
慢慢等待,直到程序运行结束,把对应的关键帧轨迹保存在
KeyFrameTrajectory.txt文件中。
%YAML:1.0#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------# Camera calibration and distortion parameters (OpenCV)
Camera.fx: 500.0
Camera.fy: 500.0
Camera.cx: 320.0
Camera.cy: 240.0Camera.k1: 0
Camera.k2: 0
Camera.p1: 0
Camera.p2: 0
Camera.k3: 0# Camera frames per second
Camera.fps: 30.0# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 0#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000# ORB Extractor: Scale factor between levels in the scale pyramid
ORBextractor.scaleFactor: 1.2# ORB Extractor: Number of levels in the scale pyramid
ORBextractor.nLevels: 8# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast
ORBextractor.iniThFAST: 10
ORBextractor.minThFAST: 5#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
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
// 该文件将打开你电脑的摄像头,并将图像传递给ORB-SLAM2进行定位// opencv
#include <opencv2/opencv.hpp>// ORB-SLAM的系统接口
#include "System.h"
#include <string>
#include <chrono> // for time stamp
#include <iostream>using namespace std;// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myslam.yaml";
string vocFile = "./Vocabulary/ORBvoc.txt";int main(int argc, char **argv) {// 声明 ORB-SLAM2 系统ORB_SLAM2::System SLAM(vocFile, parameterFile, ORB_SLAM2::System::MONOCULAR, true);// 获取相机图像代码cv::VideoCapture cap(0); // change to 1 if you want to use USB camera.// 分辨率设为640x480cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);// 记录系统时间auto start = chrono::system_clock::now();while (1) {cv::Mat frame;cap >> frame; // 读取相机数据auto now = chrono::system_clock::now();auto timestamp = chrono::duration_cast<chrono::milliseconds>(now - start);SLAM.TrackMonocular(frame, double(timestamp.count())/1000.0);}return 0;
}
#生成调用摄像头可执行文件
add_executable(myslam myslam.cc)
target_link_libraries(myslam ${PROJECT_NAME})
./build.sh
终端进入ORB_SLAM2文件,开启摄像头运行ORB_SLAM2:
./Examples/Monocular/myslam Vocabulary/ORBvoc.txt myslam.yaml
然后第二部,我们开始制作一个相机标定的文件。同样我们假设参数。
%YAML:1.0#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------# Camera calibration and distortion parameters (OpenCV)
Camera.fx: 500.0
Camera.fy: 500.0
Camera.cx: 320.0
Camera.cy: 180.0Camera.k1: 0
Camera.k2: 0
Camera.p1: 0
Camera.p2: 0
Camera.k3: 0# Camera frames per second
Camera.fps: 30.0# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 0#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 2000# ORB Extractor: Scale factor between levels in the scale pyramid
ORBextractor.scaleFactor: 1.2# ORB Extractor: Number of levels in the scale pyramid
ORBextractor.nLevels: 8# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
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
第三步,我们编写程序myvideo.cc文件,打开事先录制的视频文件,然后将图片传递给ORB SLAM2进行运行。关键的代码已经加了注释了,就不再一一介绍了。
// 该文件将打开给定的视频文件,并将图像传递给ORB-SLAM2进行定位// 需要opencv
#include <opencv2/opencv.hpp>// ORB-SLAM的系统接口
#include "System.h"#include <string>
#include <chrono> // for time stamp
#include <iostream>using namespace std;// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myvideo.yaml";
string vocFile = "./Vocabulary/ORBvoc.txt";// 视频文件
string videoFile = "./myvideo.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 1 if you want to use USB camera.// 记录系统时间auto start = chrono::system_clock::now();while (1) {cv::Mat frame;cap >> frame; // 读取相机数据if ( frame.data == nullptr )break;// rescale because image is too largecv::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);}SLAM.Shutdown();return 0;
}
第四步,我们需要讲这个文件与ORB SLAM2进行结合。我们把这些代码文件放在ORB SLAM2/目录下,在ORB SLAM2对应的CMakeLists.txt文件的末尾加入一下代码:
#生成调用myvideo.mp4 可执行文件
add_executable(myvideo myvideo.cc)
target_link_libraries(myvideo ${PROJECT_NAME})
ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转)相关推荐
- 视频转图片序列、图像序列转视频等处理(mmcv vs. opencv)
文章目录 mmcv简介 视频常用代码片段 加载视频 读取视频帧 视频转图像序列 1. `mmcv`版本 2. `opencv`版本(大部分工程里使用) 图像序列转视频 `mmcv`版本 剪辑视频片段 ...
- Pytroch 深度学习 跑CIFAR10数据集
CPU跑 from torch.utils.tensorboard import SummaryWriter#from model import *import torchvision from to ...
- yolo v5代码运行图片、调用摄像头、视频
一.运行 1.视频 修改detect文件219行. default=ROOT / 'data/images/3.mp4' 2.调用摄像头 修改detect文件219行 parser.add_argum ...
- SLAM学习 | 论文研读《ORB: an efficient alternative to SIFT or SURF》
SLAM学习 | 论文研读<ORB: an efficient alternative to SIFT or SURF> 1 文章翻译 Abstract(摘要) 1 Introductio ...
- SLAM学习--常用数据集
下面列举几个视觉SLAM常用的数据集. 参考链接: 视觉SLAM常用的数据集_编程芝士的博客-CSDN博客_slam数据集 常用的数据集有:KITTI数据集.EuRoC数据集.TUM数据集.Oxfor ...
- 显示三维图片序列_SLAM结合三维检测
11.11---11.17 在此前一周进行yolo与cube slam整合的时候,采用ros通信的方式.存在两个问题:一个是darknet检测不到目标,就不对外发布检测结果,会造成检测结果和图片序 ...
- SLAM学习笔记 - ORB_SLAM2源码运行及分析
参考资料: DBow2的理解 单目跑TUM数据集的运行和函数调用过程 跑数据集不需要ros和相机标定,进入ORB_SLAM目录,执行以下命令: ./Examples/Monocluar/mono_tu ...
- SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别
本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...
- 视觉SLAM学习路线
导师让我了解SLAM,SLAM原本是比较小众的方向,最近自动驾驶火起来,做这个SLAM的人也多了,反过来也会推动机器人感知的发展.希望未来学成的时候,能赶上机器人大规模普及,就业一片蓝海. 关于视觉S ...
最新文章
- Zookeeper分布式集群部署
- 科普扫盲,HTTP Status Code详解,从此排错无忧!
- vba显示正在加载_利用VBA代码显示工作簿的路径及完全路径的方案及对工作薄的操作...
- 联手寒武纪发布AI推理服务器,推出AI管理平台,中科曙光也All in AI
- 《你不知道的JavaScript》学习佛系梳理
- 开发一个 app 有多难?
- 非淡泊无以明志,非宁静无以致远。
- 日语——动词的各种变形
- 3大基础模型,搞掂互联网产品分析
- 分布式定时任务原理以及解决方案-指定时间执行定时任务
- varchar varchar2异同
- 工业交换机和普通交换机的区别
- Oracle数据库连接的账号密码过期的解决教程
- 30.华为WLAN产品特性介绍_AP管理
- C语言程序设计物资信息管理系统,c语言仓库物资管理系统亲测可用.docx
- 基于果蝇优化算法的函数寻优算法
- arduino控制模数转换器代码
- iCELLis 在病毒载体疫苗上的应用
- 2018 存储技术热点与趋势总结
- 一条咸鱼的java学习笔记第7天之Oracle数据库
热门文章
- 从2018年12月起陆续将博客搬至博客园(cnblogs)
- 深拷贝的缺点_JavaScript 深拷贝
- idea shell 中的函数 跳转_PHP如何为函数执行设置超时?
- php一句话图片木马过滤_php一句话图片木马怎么解析
- ubuntu修改登陆用户名称_修改ubuntu的用户名(注意用户名和主机名的区别)
- 入门Mac快捷键详细分类整理,包括Eclipse和Android Studio中一些常用的快捷键
- 【线段树 泰勒展开】Codechef April Challenge 2018 Chef at the Food Fair
- Rancher2.0中邮件通知的设置
- CentOS的改变系统启动级别
- C# WPF Application 下的文件操作