SLAM第五講點雲拼接思路筆記

2021-08-20 15:42:27 字數 2509 閱讀 2076

1.用vector和vector定義變數和相機位姿。

vectorcolorimgs, depthimgs;    // 彩色圖和深度圖

vector> poses;

容器的基本使用:

2.讀取

(1)先設位址,位姿位址就乙個。用

ifstream fin("../pose.txt")
直接讀取。

位址有多個,需要在for迴圈裡,先boost::format fmt("../%s/%d.%s"),把影象檔案格式統一一下。

boost::format fmt( "./%s/%d.%s" ); //影象檔案格式

colorimgs.push_back( cv::imread( (fmt%"../color"%(i+1)%"png").str() ));

depthimgs.push_back( cv::imread( (fmt%"../depth"%(i+1)%"pgm").str(), -1 )); // 使用-1讀取原始影象

其實就是找到影象儲存的路徑,然後放入先前建立好的vector中。cv::imread讀的是引數,所以fmt還要再.str()將其變為字串。

(2)位姿資料裡面定義的有7個量,前面3個是位移,後面四個是四元數,最後乙個是實部。

定義乙個7個變數的陣列並初始化為0,然後定義一引用,乙個for迴圈,讓for迴圈遍歷data中的每一元素d,並給每個元素賦位姿裡的值。

double data[7] = ;

for ( auto& d:data )//auto自動型別轉換

fin>>d;//檔案流型別的變數fin將pose.txt中的資料給了d陣列,//將上面的每個的外參都給了d

eigen::quaterniond q( data[6], data[3], data[4], data[5] ); //四元數 data[6]是實數 但是coeffs輸出的是先虛數後實數

eigen::isometry3d t(q); //變換矩陣初始化旋轉部分,

t.pretranslate( eigen::vector3d( data[0], data[1], data[2] ));//變換矩陣初始化平移向量部分

poses.push_back( t ); //儲存變換矩陣到位姿陣列

在這裡簡介一下auto:程式設計時常常需要把表示式的值賦給變數,這就要求在宣告變數的時候清楚知道表示式的型別。然而要做到這一點並非那麼容易,有時候甚至根本做不到。為了解決這個問題,c++11標準引入了auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別。

用這7個值構成乙個位姿t.

放在i迴圈下,說明i=1的時候對應乙個位姿,每個i對應的位姿並不相同。

3.定義內參和尺度

double cx = 325.5;

double cy = 253.5;

double fx = 518.0;

double fy = 519.0;

double depthscale = 1000.0;

cout<<"正在將影象轉換為點雲..."<4.定義rgb值pointt和點雲pointcloud

typedef pcl::pointxyzrgb pointt;

typedef pcl::pointcloudpointcloud;

5.新建乙個點雲

// 新建乙個點雲,pointcoud::ptr是乙個智慧型指標類 通過建構函式初始化指標指向的申請的空間

//pointcloud 是乙個智慧型指標型別的物件

pointcloud::ptr pointcloud( new pointcloud );

// pcl::pointcloud::ptr pointcloud( new pcl::pointcloud);

6.由得到畫素座標。接下來通過畫素座標計算出畫素在相機座標系下的座標。公式簡單。

z=d/尺度因子。

d是每個畫素對應的深度值,可以通過depth.ptr讀取出來。

x=(u-cx)*z/fx;y=(u-cy)*z/fy.得到。

然後通過相機位姿算出在世界座標系下的座標。

定義乙個pcl點p.這個p有六個值,x,y,z,b,g,r。x,y,z就是世界座標系下的座標,b,g,r就是顏色值。這6個值構成了點p.點雲的points.push_back()把乙個乙個點p放進去,就構成了點雲。

for ( int i=0; i<5; i++ )

7.點雲拼接

pointcloud->is_dense = false;//
這裡有可能深度圖中某些畫素沒有深度資訊,那麼就是包含無效的畫素,所以先置為假

cout<<"點雲共有"

SLAM學習 拼接點雲

根據 rgb d 影象和相機內參,我們可以計算任何乙個畫素在相機座標系下的位置。同時,根據相機位姿,又能計算這些畫素在世界座標系下的位置。如果把所有畫素的空間座標都求出來,相當於構建一張類似於地圖的東西。本程式提供了五張 rgb d 影象,並 且知道了每個影象的內參和外參 準備了五對影象,位於 sl...

SLAM十四講點雲實踐中段錯誤核心轉儲解決方法

程式執行結果如下圖 使用gdb除錯 除錯結果如下 發現都跟容器vector有關。想到上學期做作業時遇到的錯誤 在矩陣運算時呼叫了 eigen 庫,為了提高運算速度,向量化必須要求向量是以 16 位元組即 128bit 對齊的方式分配記憶體空間,所以針對這個問題,容器需要使用 eigen 自己定義的記...

雲計算與大資料 第五章

www是到目前為止最著名的分布式應用,中文名字為 全球資訊網 常簡稱為web。www是目前世界上最具影響力的網際網路服務,起源於1990年底,最早由歐洲核物理研究中心的tim berners lee提出的超文字傳輸協議http,其目的是為研究中心分布在世界各地的科學家提供乙個共享資訊的平台。從應用功...