multi-camera项目学习

1. 安装: 

2. 试运行example

3. 传入参数分析:

./Examples/Lafida/multi_col_slam_lafida ./Examples/small_orb_omni_voc_9_6.yml  ./Examples/Lafida/Slam_Settings_indoor1.yaml ./Examples/Lafida/ $HOME$/Downloads/IndoorDynamic

第一个参数:small_orb_omni_voc_9_6.yml 用于加载ORB_VOCALBULARY,源码中为:

cv::FileStorage fsVoc(strVocFile.c_str(), cv::FileStorage::READ);
ORBVocabulary Vocabulary;
Vocabulary.load(fsVoc);
mpVocabulary = new ORBVocabulary(Vocabulary);

为什么需要加载这个呢,主要用于特征空间的划分和BoW Vector的计算;ORB-SLAM采用的是bag of word 的方式将图像中的多个局部描述符表示成一个定长的全局特征,而vocabulary tree 是局部描述符量化和索引的一种高校数据结构。它实际上就是通过学习的方法实现对原始特征空i教案的一种划分而已。 ORB-SLAM2中附带的ORBvoc.txt是拿大量通用场景下啊的图像提取的ORB特征,分册聚类出来的,作者生成在不同场景下都可以有很好的效果。2. 计算bow vector, 关键帧和查询帧的相似度是通过bow vector的距离来衡量的;参考: https://www.zhihu.com/question/49153462

第三个参数输入的是一个路径./Examples/Lafida/ , 主要用于加载多相机标定时的相机外参和内参;用到的文件为MultiCamSys_Calibration.yaml, 用于保存三个相机之间的RT参数,其中T参数是经过CAYLEY TRANSFORM的;然后就会用到InteriorOrientationFisheye0.yaml 等文件,用于加载当前相机的内参;一些重要的文件或参数的读取都是在Csystem.cpp文件中, 其中相机外参文件中的参数为1*6, 前三个表示旋转,后三个表示平移,不同的标定方法得到的参数格式也会有所不同,源码中也给出了相应的转换方式。

# camera back
CameraSystem.cam1_1: -0.0238361786473007   #r1
CameraSystem.cam1_2: -2.05998171167958     #r2
CameraSystem.cam1_3: 0.695126790868671     #r3
CameraSystem.cam1_4: -0.140202124607334    #t1
CameraSystem.cam1_5: 0.0219677971160655    #t2
CameraSystem.cam1_6: -0.0226322662838432   #t3

example中的文件如上所示,源码中在load文件时,会将该参数load为一个6*1的矩阵, 然后经过cayley2hom()函数转换为4*4;转换方法如下:

/**
* 6x1 minimal homogeneous transformation vector to homogeneous 4x4 transformation matrix
* @param c	6x1 Cayley parameters and translation
* @return T 4x4 homogeneous transformation matrix
*/
template<typename T>
cv::Matx<T, 4, 4> cayley2hom(const cv::Matx<T, 6, 1>& cayleyRep)
{
cv::Matx<T, 3, 1> cayleyR(cayleyRep(0, 0), cayleyRep(1, 0), cayleyRep(2, 0));
cv::Matx<T, 3, 3> R = cayley2rot(cayleyR);

cv::Matx<T, 4, 4> homM(
		R(0, 0), R(0, 1), R(0, 2), cayleyRep(3, 0),
		R(1, 0), R(1, 1), R(1, 2), cayleyRep(4, 0),
		R(2, 0), R(2, 1), R(2, 2), cayleyRep(5, 0),
		T(0), T(0), T(0), T(1));
		return homM;
}

通过函数也可以看出来,主要时对旋转矩阵进行了转换,平移矩阵不变,剩余的位置用0和1补齐成为4x4的RT矩阵;

我标定得到的外参文件是3*4的矩阵,3*3的R,以及3*1的T,这里也可以用hom2cayley() 函数再次转换以便于保存参数到.yaml文件中;这里给出一个example:

cv::Matx<double, 4, 4> C2(0.971856,  0.0218653 ,- 0.234557 , 0.101694,
			-0.0538169,  0.98996 ,- 0.130699,  0.191133,
			0.229345,  0.139644,  0.963276 , 0.0592288,0,0,0,1);

cv::Matx <double, 6, 1> new_C2 = hom2cayley(C2);
cout << "new_C2" << std::endl << new_C2;

3. 运行步骤:

按照要求传入参数,其中slam参数设置采用Slam_Settings_indoor1.yaml中的参数,将extractor.descSize 改为16;现有如下几个问题:1. 运行过程中会报错。显示如下:

2. camera1的特征点提取明显少于camera0

另外,很多人看完之后好奇多目的标定,这里奉上我之前总结的标定方法:

https://blog.csdn.net/qq_25458977/article/details/91044103

主要使用的是MCPTAM这个项目实时在线标定,我记得这个项目编译的时候会有一些小的问题,单摄像头可以很快标定完成,但是多摄像头需要一点耐心,有几个需要注意的就是:

1. 重叠区域一定要有,甚至是越大越好;

2.尽可能在纹理比较丰富的场景中,更方便标定成功。

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值