pangolin於SLAM的實戰學習(三)

2021-09-25 11:14:00 字數 3332 閱讀 8763

目錄

9.繪製點和製作點雲效果

10.將影象特徵點加入原第八程式

程式:上一節:

繪製點是比較簡單的:

在繪圖的子函式中加入類似如下語句即可,給予顏色和位置。

for(int p=0;p繪製點雲還需要原始點的資訊。類似於slam14講的第五講拼接點雲。

cv::mat color = colorimgs[i];

cv::mat depth = depthimgs[i];

eigen::isometry3d t = poses[i];

for ( int v=0; v(v);

for ( int u=0; u( v )[u]; // 深度值

if ( d==0 ) continue; // 為0表示沒有測量到

eigen::vector3d point; vectorpoint_pose;

point[2] = double(d)/depthscale;

point[0] = (u-cx)*point[2]/fx;

point[1] = (v-cy)*point[2]/fy;

eigen::vector3d pointworld = t*point;

point_pose.push_back(pointworld[0]);

point_pose.push_back(pointworld[1]);

point_pose.push_back(pointworld[2]);

point_pose.push_back(double(data[3*u+0]));

point_pose.push_back(double(data[3*u+1]));

point_pose.push_back(double(data[3*u+2]));

pose_of_world.push_back(point_pose);

point_pose.clear();} }

效果如圖:

大概效果這樣:

要修改的地方有獲取特徵點位置與顏色:

feature_img = color.clone();

cv::ptrdetector;

detector = orb::create();

vector< cv::keypoint > kp1;

detector->detect( color, kp1 );

for(int kp_num=0;kp_numpoint_pose;

eigen::vector3d point;

// 深度值

unsigned int d = depth.ptr(int ( kp1[kp_num].pt.y ))[int(kp1[kp_num].pt.x)];

point[2] = double(d)/depthscale;

point[0] = (int (kp1[kp_num].pt.x)-cx)*point[2]/fx;

point[1] = (int (kp1[kp_num].pt.y)-cy)*point[2]/fy;

eigen::vector3d pointworld = t*point;

point_pose.push_back(pointworld[0]);

point_pose.push_back(pointworld[1]);

point_pose.push_back(pointworld[2]);

point_pose.push_back(double(color.at(int ( kp1[kp_num].pt.y ),int ( kp1[kp_num].pt.x ))[0]));

point_pose.push_back(double(color.at(int ( kp1[kp_num].pt.y ),int ( kp1[kp_num].pt.x ))[1]));

point_pose.push_back(double(color.at(int ( kp1[kp_num].pt.y ),int ( kp1[kp_num].pt.x ))[2]));

pose_of_world.push_back(point_pose);

point_pose.clear();

}

繪製特徵點圖:

if(int ( kp1[kp_num].pt.y)-1>0&int(kp1[kp_num].pt.y)-1<640&int(kp1[kp_num].pt.y)-1>0&int(kp1[kp_num].pt.y)-1<640)

}}

繪製地圖點:

//畫點

glpointsize(2);

glbegin(gl_points);

for(int p=0;p修改gui:

//設計顯示面板

pangolin::createpanel("menu").setbounds(0.33,1,0.0,0.3);

//定義面板

pangolin::view& fea_image = pangolin::display("feature")

.setbounds(0,0.5,0.0,0.33,1024.0f/768.0f)

.setlock(pangolin::lockleft, pangolin::lockbottom);

pangolin::view& rgb_image = pangolin::display("rgb")

.setbounds(0,0.5,0.33,0.66,1024.0f/768.0f)

.setlock(pangolin::lockleft, pangolin::lockbottom);

pangolin::view& depth_image = pangolin::display("depth")

.setbounds(0,0.5,0.66,0.99,1024.0f/768.0f)

.setlock(pangolin::lockleft, pangolin::lockbottom);

pangolin庫的簡單使用

原文 pangolin是opengl的輕量級封裝 解釋均在注釋之中 include int main int argc char ar 變換矩陣 glmultmatrixf twc.data 畫點 glpointsize 10.0f glbegin gl points glcolor3f 1.0 1...

雷射slam 雷射SLAM與視覺SLAM的特點

雷射slam與視覺slam的特點 目前,slam技術被廣泛運用於機械人 無人機 無人駕駛 ar vr等領域,依靠感測器可實現機器的自主定位 建圖 路徑規劃等功能。由於感測器不同,slam的實現方式也有所不同,按感測器來分,slam主要包括雷射slam和視覺slam兩大類。其中,雷射slam比視覺sl...

SLAM 已開源的SLAM彙總

youtube鏈結 特殊之處 相對於fcn而言,將獲取的語義資訊投影到kinect地圖裡 獲取3d的地圖 一般的語義分割都是影象形態 沒有定位資訊,這個有相對的三維位置關係 儀器 kinect 需要深度圖 youtube鏈結 github鏈結 儀器 elastic本身需要kinect深度圖 3 po...