第九章VO測試程式

2021-08-10 23:34:02 字數 4576 閱讀 4134

run_vo.cpp

// -------------- test the visual odometry -------------

#include

#include

#include

#include

#include

#include "myslam/config.h"

#include "myslam/visual_odometry.h"

int main ( int argc, char** argv )

//鏈結引數檔案

myslam::config::setparameterfile ( argv[1] );

//構造vo,型別就是在visualodometry類中定義的指向自身型別的指標,然後用new開闢記憶體

myslam::visualodometry::ptr vo ( new myslam::visualodometry );

//讀取資料資料夾位址

string dataset_dir = myslam::config::get ( "dataset_dir" );

cout

<

/讀取資料資料夾中的associate.txt檔案

ifstream fin ( dataset_dir+"/associate.txt" );

//防呆,沒讀取成功的話輸出錯誤

if ( !fin )

//定義名陣列和時間戳陣列,用於存放associate.txt檔案中所示的時間戳對其的rgb影象和depth影象

vector

rgb_files, depth_files;

vector

rgb_times, depth_times;

//迴圈讀取直到檔案末尾

while ( !fin.eof() )

//建立相機

myslam::camera::ptr camera ( new myslam::camera );

// visualization

//視覺化內容,用到opencv中的viz模組

//第一步、創造乙個視覺化視窗,構造引數為視窗名稱

cv::viz::viz3d vis("visual odometry");

//第二步、建立座標系部件,這裡座標系是以widget部件型別存在的,

// 構造引數是座標系長度,也就是可視窗裡的錐形小座標系的長度,下面對座標系部件進行設定

cv::viz::wcoordinatesystem world_coor(1.0), camera_coor(0.5);

//這裡設定座標系部件屬性,然後新增到檢視視窗上去

//首先利用setrenderingproperty()函式設定渲染屬性,

// 第乙個引數是個列舉,對應要渲染的屬性這裡是線寬,後面是屬性值

world_coor.setrenderingproperty(cv::viz::line_width, 2.0);

camera_coor.setrenderingproperty(cv::viz::line_width, 1.0);

//用showwidget()函式將部件新增到視窗內

vis.showwidget( "world", world_coor );

vis.showwidget( "camera", camera_coor );

//至此,視窗中已經顯示了全部需要顯示的東西,就是兩個座標系:世界座標系,相機座標系。

//世界座標系就是寫死不動的了,所以後面也沒有再提起過世界座標系。需要做的就是計算出各個幀的相機座標系位置

//後續的核心就是下面的for迴圈,在迴圈中,不斷的給相機座標系設定新的pose,然後達到動畫的效果。

//第三步、設定視角。這步是非必要步驟,進行設定有利於觀察,

//不設定也會有預設視角,就是可能比較彆扭。而且開始後拖動滑鼠,也可以改變觀察視角。

//構建三個3d點,這裡其實就是構造makecamerapose()函式需要的三個向量:

//相機位置座標、相機焦點座標、相機y軸朝向

//藍色-z,紅色-x,綠色-y

cv::point3d cam_pos( 0, -1, -1 ), cam_focal_point(0,0,0), cam_y_dir(0,1,0);

//由這三個引數,用makecamerapose()函式構造affine3d型別的相機位姿,這裡其實是視角位姿,也就是程式開始時你處在什麼視角看

cv::affine3d cam_pose = cv::viz::makecamerapose( cam_pos, cam_focal_point, cam_y_dir );

//用setviewerpose()設定**視角

vis.setviewerpose( cam_pose );

//輸出rgb影象資訊,共讀到檔案數

cout

<

/整個畫面的快速重新整理呈現動態,由此for迴圈控制。

for ( int i=0; i//讀取影象,建立幀操作

mat color = cv::imread ( rgb_files[i] );

mat depth = cv::imread ( depth_files[i], -1 );

if ( color.data==nullptr || depth.data==nullptr )

break;

myslam::frame::ptr pframe = myslam::frame::createframe();

pframe->camera_ = camera;

pframe->color_ = color;

pframe->depth_ = depth;

pframe->time_stamp_ = rgb_times[i];

//這裡加個每幀的運算時間,看看實時性

boost::timer timer;

//這裡將幀新增進去,進行位姿變換計算

vo->addframe ( pframe );

cout

<

/vo狀態為lost時,跳出迴圈。

if ( vo->state_ == myslam::visualodometry::lost )

break;

//這裡要說一下,視覺化視窗中動的是相機座標系,所以本質上是求取相機座標系下的點在世界座標系下的座標,

//pw=twc*pc;

se3 twc = pframe->t_c_w_.inverse();

//se3 twc = pframe->t_c_w_;

//show the map and the camera pose

//用twc構造affine3d型別的pose所需要的旋轉矩陣和平移矩陣

cv::affine3d::mat3 rmat(

twc.rotation_matrix()(0,0), twc.rotation_matrix()(0,1), twc.rotation_matrix()(0,2),

twc.rotation_matrix()(1,0), twc.rotation_matrix()(1,1), twc.rotation_matrix()(1,2),

twc.rotation_matrix()(2,0), twc.rotation_matrix()(2,1), twc.rotation_matrix()(2,2)

);cv::affine3d::vec3 tvec(twc.translation()(0,0), twc.translation()(1,0), twc.translation()(2,0));

//構造位姿

cv::affine3d pose(rmat,tvec);

//兩視窗同時顯示,乙個是影象

cv::imshow("image", color );

cv::waitkey(1);

//另外乙個就是viz視覺化視窗

看這張執行圖:

小的相機座標系會動,大的世界座標系是不動的。

座標軸顏色對應為:藍色z,紅色x,綠色y。

這個視角就是開始執行時的視角,也就是我們視角設定的效果。可以對應cam_pose,cam_focal,cam_y_dir這三個引數看出分別是設定什麼東西:

cam_pose, 就是觀察者位置,文中設定的是(0, -1, -1),從執行結果圖上看,感覺上你就是站在(0, -1, -1)處。

cam_focal,就是觀察者對準什麼位置看,直觀上也就是整個視窗的正中心顯示什麼,這裡為(0, 0, 0)。所以,主觀感受上是正對著原點瞅,另外原點也很明顯的在視窗正中心。

cam_y_dir,這個不怎麼明白,原始碼上是這麼解釋的:@param y_dir up vector of the camera in global coordinate frame.但是看結果來看,貌似是下方向的指向,因為圖中很明顯(0, 1, 0)是指向下方的。單獨測試更改一下引數看結果,也瞅不出來什麼規律。

第九章測試

單選題 中醫 治未病 的理念體現了中醫藥服務在養老中 的優勢 a.醫 b.養 c.防 防 單選題 我國 9073養老模式 中,提倡90 的老人依靠 養老。a.居家 b.社群 c.機構 d.互助 居家 單選題 我國 9073養老模式 中,提倡7 的老人依靠 養老。a.居家 b.社群 c.機構 d.互助...

網頁製作 第九章測試

第1部分 總題數 5 單選題 2分 下面哪個css屬性是用來改變背景顏色的 a.bgcolor b.text c.background color d.color 本題總得分2分 單選題 2分 怎樣給所有的 h1 標籤新增背景顏色 a.h1 b.h1.all c.h1 d.h1 本題總得分2分 單選...

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...