1. 程式人生 > >ICP+點雲拼接實踐

ICP+點雲拼接實踐

寫程式時覺得自己的邏輯和思路比較混亂,而且僅僅是在寫比較小的程式、無需構架方面的考慮時。比如,試圖修改14講的ICP演算法,使之結合拼接點雲實驗時,需要將前面匹配的keypoints座標、顏色、深度儲存,並在拼接點雲時作為引數傳入,半天不知道該在哪裡加,總感覺原本的寫法用起來不太會。遂從提取特徵點開始,重寫之。
第一步,先搞清楚每個部分如何實現吧,十分具體的框圖如下
這裡寫圖片描述

接下來,要往裡面新增儲存顏色、座標的程式碼。匹配點最後篩選時入棧了,那對於之前檢測到的特徵點,檢測時我們也一起提取出顏色、座標、深度,在符合要求匹配點入棧時,一起使之入棧,是否可行?
在點雲拼接實驗中
colorImgs, depthImgs的型別是vector

vector<cv::Mat> colorImgs, depthImgs;
colorImgs.push_back(cv::imread(picture[i].str()));
depthImgs.push_back(cv::imread(picture[i].str(),-1));//使用-1讀取原始影象?啥意思
cv::Mat color = colorImgs[i];
cv::Mat depth = depthImgs[i];

新建點雲

typedef pcl::PointXYZRGB PointT;    //定義點雲的格式,用XYZRGB,都有哪些方法?
typedef pcl::PointCloud<PointT> PointCloud; //用來存放點雲
//新建一個點雲 PointCloud::Ptr pointCloud(new PointCloud); PointT p; //已知世界座標pointWorld(pw),型別是Vector3d p.x=pw[0]; p.y=pw[1]; p.z=pw[2]; p.b=color.data[color.step+color.channels()]; p.g=color.data[color.step+color.channels()+1]; p.r=color.data[color.step+color.channels()+2]; pointCloud->points.push_back(p);

另一個sfm實驗中,colors_for_all型別是vector