ICP+點雲拼接實踐
阿新 • • 發佈:2018-11-27
寫程式時覺得自己的邏輯和思路比較混亂,而且僅僅是在寫比較小的程式、無需構架方面的考慮時。比如,試圖修改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