1.定義圖片變量和相機位姿。用vector<cv::Mat>和vector<Eigen::Isometry3d>就可以了。
2.讀取
(1)先設地址,位姿地址就一個。用ifstream fin("./pose.txt")直接讀取就可以了。而圖片地址有多個。就需要在for循環里,先boost::format fmt("../%s/%d.%s"),把圖像文件格式給統一一下。那輸入的時候是fmt%什么就可以了。就像之前輸入文檔一樣。前面%s,后面%跟實際值就可以了。如果是字符串,用雙引號。
然后讀取圖片的時候用push_back函數里面再套一個cv::imread的函數。cv::imread是用來讀取圖片的。之前就定義過image=cv::imread(argv[1]),cv::imread讀的是參數,所以fmt還要再.str()一下。
就是colorImage.push_back(cv::imread((fmt%"color"%(i+1)%"png").str()))就可以了。
如果讀取原始圖像,cv::imread后面還要再加一個參數-1.
(2)位姿數據里面定義的有7個量,前面3個是位移,后面四個是四元數,最后一個是實部。
讀取位姿的思路是這樣的。先定義一個7個變量的數組並初始化為0。然后定義一引用,一個for循環,讓for循環遍歷data中的每一元素d,並給每個元素賦位姿里的值。fin>>d.
double data[7]={0};
然后用這7個值構成一個位姿T.
放在i循環下,說明i=1的時候對應一個位姿,每個I對應的位姿並不相同啊。
3.定義內參和尺度,方便之后計算。
4.定義RGB值PointT和點雲pointcloud.
5.由圖片,可以知道像素坐標。下面就是要由像素坐標計算出像素在相機坐標系下的坐標。公式簡單。
z=d/尺度因子。
d是每個像素對應的深度值,可以通過depth.ptr<unsigned short>讀取出來。
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放進去,就構成了點雲。
6.拼接點雲
拼接點雲特別簡單。用一個函數pcl::io::savePCDFileBinary()就可以了。函數參數是要存的點雲名字,和要拼接的點雲名稱。注意,點雲是指針形式。
看點雲用pcl_viewer.