首先需要在ORB-SLAM2中将位姿导出,对ORB-SLAM2进行一些i需改,使它可以提供稀疏点云、位姿、内参。
1.在Map文件下增添如下函数
public:
void Save(const string &filename,const cv::MatSize
image_size);
void SaveMapPoint(ofstream &f, MapPoint* mp);
void SaveKeyFrame(ofstream &f, KeyFrame* kf);
protected:
std::vector<int> KeyId;
2.在System下增加
void System::SaveMap(const string &filename,const
cv::MatSize image_size);
3.在mono_tum.cpp或者orbslam的其他Examples中对
System::SaveMap(const string &filename,const cv::MatSize
image_size)这个函数进行调用即可。
SLAM.SaveMap("../Examples/output/sfm.txt",im.size);
OpenMVS接受SLAM的数据格式
MVS | 640 | 360 | ||||||||
4 | ||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
8 | ||||||||||
-204.078 | 245.198 | 1358.24 | 3 | 0 | 1 | 2 | ||||
-34.1322 | 55.5052 | 1121.00 | 4 | 0 | 1 | 2 | 3 | |||
-1897.5 | 1659.16 | 1542.02 | 2 | 1 | 2 |
第一行:640 360图像尺寸
第二行:4 关键帧个数
第三行:第一个数字是关键帧的序号,然后依次是fx、fy、cx、cy,后三个是R
第四行:稀疏点个数
第五行及以后:后四个表示看到这个稀疏点的关键帧个数以及关键帧的序号
OpenMVS接口
加入了read_pose.cpp、read_pose.h这两个 c++文件,目的是对SLAM导出的位姿和稀疏点云进行读取,并对OpenMVS 进行初始化。
主要核心函数有
bool load_scene(string file,Scene &scene);
bool read_mvs_pose(string file,MVSPOSE &mvs_pose);
bool save_pointcloud_obj(string name, vector<POINT3F>
points,int num_keyframes,RGB color)