日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转)

發(fā)布時(shí)間:2025/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:用ORB SLAM2跑自己的數(shù)據(jù)集 使用圖片序列或攝像頭或視頻 實(shí)踐篇_不二青衣的博客-CSDN博客_orbslam2運(yùn)行自己的數(shù)據(jù)集

學(xué)習(xí)?

做實(shí)驗(yàn)參考使用,侵權(quán)則刪

用ORB SLAM2跑自己的圖片序列數(shù)據(jù)集

首先,我們需要知道圖片的采集時(shí)間,這個(gè)可以從采集的儀器(各種各樣的)上得到圖片與時(shí)間一一對(duì)應(yīng)。小樹的問(wèn)題描述:現(xiàn)有數(shù)據(jù)集視頻,首先使用激光SLAM跑出來(lái)了一個(gè)軌跡,該軌跡作為groundtruth,將相同的數(shù)據(jù)集用純視覺(jué)SLAM方法跑一下,然后與groundtruth做對(duì)比評(píng)判誤差。

第一步:制作rgb/目錄并把圖片信息放進(jìn)去。我們知道ORB SLAM2的輸入是圖片,首先將視頻處理成圖片,在windows平臺(tái)下使用默認(rèn)視頻播放器都是可以處理的,不需要寫代碼便可以完成,我們可以設(shè)置按照1,2,3,4,5…這樣的順序存放。我們的采集頻率是30幀/s,那么也按照相關(guān)的設(shè)置即可,最終得到5147張圖片。



圖像重新命名 對(duì)應(yīng)時(shí)間戳的信息(按照時(shí)間戳為名字為圖片依次重命)

由于我們需要對(duì)應(yīng)時(shí)間戳的信息,接下來(lái)我們就來(lái)為圖像重新命名吧。我們按照時(shí)間戳為名字為圖片依次重命名。由于處理的量較大,我采用的處理思路是:將原來(lái)的名字存在一個(gè)文本中”yuanlaimm.txt“,將 將來(lái)的名字存在”jianglai.txt"文本文件中。接下來(lái)使用python實(shí)現(xiàn)重命名操作,并創(chuàng)建一個(gè)新的文件夾用于生成重命名的圖片集合。python代碼為:

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]))

于是,我們將圖片存放到ubuntu下某一文件夾中,我的路徑是:/home/w/Pictures/leftCam0411/rgb
**第二步:制作rgb.txt文件。**拿到圖片的時(shí)間信息,比如這里我的文件是videotime.txt

........ 6347 324330090 6348 324363423 6349 324396756 6350 324430089 .....

第一列是幀數(shù),第二列是圖片一一對(duì)一的時(shí)間信息。我們按照TUM的數(shù)據(jù)集格式去制作一個(gè)rgb.txt文本文件,具體參考官方提供的比如”rgbd_dataset_freiburg1_xyz“數(shù)據(jù)集。先打開(kāi)看看官方的rgb.txt格式長(zhǎng)什么樣子:

# 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 ......

我們可以發(fā)現(xiàn)第一列就是我們?cè)谏弦黄恼轮袑?duì)應(yīng)的時(shí)間戳信息,第二列對(duì)應(yīng)的是圖片的路徑(如果不清楚,先瀏覽一下上一篇文章哦),那么我們現(xiàn)在來(lái)寫一個(gè)文件生成這個(gè)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; }

編譯運(yùn)行我們就得到了這個(gè)rgb.txt文件,如下圖:

第三步,按照ORB SLAM2的格式制作相機(jī)標(biāo)定的文件.我們可以直接copy一份TUM1.yaml然后修改自己相機(jī)對(duì)應(yīng)的相機(jī)內(nèi)參和畸變參數(shù)就可以了。比如:

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

第四步,執(zhí)行程序:

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt /home/w/Documents/left.yaml /home/w/Pictures/leftCam0411
  • 1


慢慢等待,直到程序運(yùn)行結(jié)束,把對(duì)應(yīng)的關(guān)鍵幀軌跡保存在
KeyFrameTrajectory.txt文件中。

使用攝像頭或視頻運(yùn)行ORB SLAM2
大家可以使用自己的筆記本的攝像頭來(lái)讀取周圍的環(huán)境以運(yùn)行ORB SLAM2,看看是不是可以成功運(yùn)行。如果你的筆記本恰好沒(méi)有攝像頭,你也可以外接一個(gè)USB攝像頭,這樣就不需要非禮的端著筆記本在環(huán)境中跑了。有的同學(xué)如果使用的是臺(tái)式機(jī)或者攝像頭故障也沒(méi)有關(guān)系,你可以實(shí)現(xiàn)錄制一段視頻,然后放入ORB SLAM2中運(yùn)行一下。

假設(shè)大家都是熟悉CMake工程的,并且具備按照ORB SLAM2的github介紹正確運(yùn)行ORB SLAM2的能力。接下來(lái)我們就步入正題。

ORB SLAM2提供了若干種數(shù)據(jù)集中的運(yùn)行示例,這可以作為我們學(xué)習(xí)運(yùn)行自己攝像頭程序的參考,因?yàn)榇a理解后其實(shí)結(jié)構(gòu)是十分相似的。對(duì)于數(shù)據(jù)集上的?例,ORB-SLAM2 會(huì)?先讀取數(shù)據(jù)集中的圖像,再放到SLAM 中處理。那么對(duì)于我們??的攝像頭,同樣可以這樣處理。所以最?便的?案是直接將我們的程序作為?個(gè)新的可執(zhí)?程序,加?到ORB-SLAM2 ?程中。

首先我們制作一下相機(jī)的標(biāo)定文件,如果不知道如何標(biāo)定你的攝像頭也沒(méi)有關(guān)系,我們可以使用一個(gè)不那么好的標(biāo)定參數(shù)進(jìn)行運(yùn)行,畢竟只要不使用魚眼相機(jī)之類的相機(jī),ORB SLAM2對(duì)于標(biāo)定參數(shù)也不太敏感。那我們先假設(shè)一個(gè)普通的參數(shù)吧。大家可以運(yùn)行一下看看效果。

%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

接下來(lái),我們新建一個(gè)myslam.cc文件開(kāi)始寫代碼,這段代碼定義了一個(gè)SLAM對(duì)象,然后會(huì)打開(kāi)你?帶的攝像頭(或視頻),讀取圖像,并交給ORB-SLAM2 處理。所有的主要的代碼我都在后面加了注釋,這里就不再繼續(xù)增加解釋了。

// 該文件將打開(kāi)你電腦的攝像頭,并將圖像傳遞給ORB-SLAM2進(jìn)行定位// opencv #include <opencv2/opencv.hpp>// ORB-SLAM的系統(tǒng)接口 #include "System.h" #include <string> #include <chrono> // for time stamp #include <iostream>using namespace std;// 參數(shù)文件與字典文件 // 如果你系統(tǒng)上的路徑不同,請(qǐng)修改它 string parameterFile = "./myslam.yaml"; string vocFile = "./Vocabulary/ORBvoc.txt";int main(int argc, char **argv) {// 聲明 ORB-SLAM2 系統(tǒng)ORB_SLAM2::System SLAM(vocFile, parameterFile, ORB_SLAM2::System::MONOCULAR, true);// 獲取相機(jī)圖像代碼cv::VideoCapture cap(0); // change to 1 if you want to use USB camera.// 分辨率設(shè)為640x480cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);// 記錄系統(tǒng)時(shí)間auto start = chrono::system_clock::now();while (1) {cv::Mat frame;cap >> frame; // 讀取相機(jī)數(shù)據(jù)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; }

同樣,這是一個(gè)Cmake工程,接下來(lái)我們需要講這個(gè)文件與ORB SLAM2進(jìn)行結(jié)合。我們把這些代碼文件放在ORB SLAM2/目錄下,在ORB SLAM2對(duì)應(yīng)的CMakeLists.txt文件的末尾加入一下代碼:

#生成調(diào)用攝像頭可執(zhí)行文件 add_executable(myslam myslam.cc) target_link_libraries(myslam ${PROJECT_NAME})
  • 1
  • 2
  • 3

編譯新的ORB_SLAM2:

./build.sh
  • 1

終端進(jìn)入ORB_SLAM2文件,開(kāi)啟攝像頭運(yùn)行ORB_SLAM2:

./Examples/Monocular/myslam Vocabulary/ORBvoc.txt myslam.yaml
  • 1

注:此處注意各文件的文件路徑。

現(xiàn)在你應(yīng)該可以運(yùn)行起來(lái)了,感覺(jué)如何?是不是還算簡(jiǎn)單,當(dāng)然這些代碼和文件具體內(nèi)容還是需要深入理解一下ORB SLAM2的整體的。注意:當(dāng)ORB SLAM2初始化的時(shí)候,請(qǐng)不要直接開(kāi)始旋轉(zhuǎn)或者運(yùn)動(dòng)速度過(guò)猛烈,有經(jīng)驗(yàn)的SLAMer會(huì)先左右平移運(yùn)動(dòng)讓SLAM系統(tǒng)成功初始化然后進(jìn)行的。

接下來(lái),我們看看如何使用事先錄制的視頻文件運(yùn)行ORB SLAM2。大家可以使用自己的手機(jī)等設(shè)備事先錄制一段視頻,假設(shè)保存為myvideo.mp4文件,請(qǐng)?jiān)诠庹詹粫?huì)發(fā)生明顯劇變,環(huán)境中人等的走動(dòng)不是十分劇烈,紋理特征豐富的場(chǎng)所錄制。

然后第二部,我們開(kāi)始制作一個(gè)相機(jī)標(biāo)定的文件。同樣我們假設(shè)參數(shù)。

%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文件,打開(kāi)事先錄制的視頻文件,然后將圖片傳遞給ORB SLAM2進(jìn)行運(yùn)行。關(guān)鍵的代碼已經(jīng)加了注釋了,就不再一一介紹了。

// 該文件將打開(kāi)給定的視頻文件,并將圖像傳遞給ORB-SLAM2進(jìn)行定位// 需要opencv #include <opencv2/opencv.hpp>// ORB-SLAM的系統(tǒng)接口 #include "System.h"#include <string> #include <chrono> // for time stamp #include <iostream>using namespace std;// 參數(shù)文件與字典文件 // 如果你系統(tǒng)上的路徑不同,請(qǐng)修改它 string parameterFile = "./myvideo.yaml"; string vocFile = "./Vocabulary/ORBvoc.txt";// 視頻文件 string videoFile = "./myvideo.mp4";int main(int argc, char **argv) {// 聲明 ORB-SLAM2 系統(tǒng)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.// 記錄系統(tǒng)時(shí)間auto start = chrono::system_clock::now();while (1) {cv::Mat frame;cap >> frame; // 讀取相機(jī)數(shù)據(jù)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; }

第四步,我們需要講這個(gè)文件與ORB SLAM2進(jìn)行結(jié)合。我們把這些代碼文件放在ORB SLAM2/目錄下,在ORB SLAM2對(duì)應(yīng)的CMakeLists.txt文件的末尾加入一下代碼:

#生成調(diào)用myvideo.mp4 可執(zhí)行文件 add_executable(myvideo myvideo.cc) target_link_libraries(myvideo ${PROJECT_NAME})


建立更小的工程

總結(jié)

以上是生活随笔為你收集整理的ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。