0.杂项问题汇总
1.Tracking.cc 第417行
返回值为什么要返回一个clone?
//返回当前帧的位姿
return mCurrentFrame.mTcw.clone(); // 注意这里为什么要返回一个clone?
1.2.Initializer.cc中的CheckRT()函数
这里面返回两帧之间的视差是怎么选的,没有看懂??
1.3.mpReferenceKF类成员变量参考关键帧
很多类当中都有参考关键帧,这个参考关键帧到底是如何定义的?有什么用?
- MapPoint的参考关键帧:生成这个地图点的那个关键帧,注意只有关键帧才会生成地图点,普通帧不会生成地图点。
- Frame的参考关键帧:离这个Frame最近的关键帧?在Tracking::UpdateLocalKeyFrams()中是把和当前帧共视程度最高的关键帧作为参考关键帧
- Tracking的参考关键帧:也是距离当前时刻最近的关键帧?
【1】在单目初始化的最后,把当前关键帧(实际就是单目初始化的第二帧)作为Tracking的RefKF,也就是最新的那一个RefKF
1.4.TrackReferenceKeyFrame()有什么特殊的呢?在什么时候使用这个函数?
1.5.关键帧的父子关键帧??
比如父关键帧,是怎么定义的?我记得在单目初始化的时候建立了共视关系,同时还添加了父子关键帧、生成树。
在跟踪局部地图的时候,寻找局部关键帧,有用到了父子关键帧,不是很理解为什么要挑这些子关键帧。详见Tracking.cc中的Tracking::UpdateLocalKeyFrames()第2000行左右。
1.6.Frame.cc中Frame::isInFrustum()函数判断地图点是否在视角内
这个函数里有很多判断准则没有弄明白,主要包括两部分:地图点到相机中心的距离,当前帧的观测方向和地图点的观测方向之间的夹角???
1.ORB特征点的提取
1.1.mvImagePyramidp[level](1673行
// 把图像金字塔该图层的图像指针mvImagePyramid
// 指向temp的中间部分(这里为浅拷贝,内存相同)
mvImagePyramid[level] = temp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));
如上的程序中,这种操作,这个成员变量存储的到底是temp的中间还是整个temp?
1.2.1064行为什么要划分网格提取特征点?
这个操作是把一副图像划分成很多小网格,然后在一个小网格里提取特征点,最后把所有的特征点放到一个容器中,然后再使用四叉树算法对这些特征点进行均匀化分布。为什么要划分网格提取特征点呢?不能直接对一幅图像提取特征点吗?
自答:划分网格提取特征点的话对不同的网格可以选择是否使用不同的阈值提取两次,比如这个网格如果是纹理不明显的地方使用默认阈值可能提不出来特征点,这个时候可以降低阈值再次提取一次,这样可以保证特征点尽量均匀分布。
1.3.为什么要用仿函数ORBextractor()计算特征点?
自答:仿函数作为一个类的成员函数,可以直接访问类的成员变量,这样形参中只传入一些外部参数即可。
不过好像也没有这么简单,使用普通的类的成员函数也可以啊?
1.4.上面的函数中输入输出变量是cv::InputArray和cv::OutputArray,和Mat有什么区别?
1.5.当形参是InputArray,传入的实参是Mat的时候,在函数内部这个参数被解读为什么类型?
1.6.Frame.cc中第749mat=mat.reshape(2);
去畸变的时候必须把图像变成2通道,那么定义Mat的时候指定的行和列与通道有什么关系呢?
2.地图初始化
2.1.Initializer.cc第132行
这里vector中存储的是size_t的数据类型,那么这个到底被解释为什么数据类型?
好像是根据数据的长度自动解释?
2.2.Tracking.cc第977行CreateInitialMapMonocular()
这个函数是初始化的时候根据前两帧,恢复出了R和t,并且使用三角化得到了3D点的位置之后,根据3D点建立地图点,并初始化地图。内部设计的东西比较多,暂时没看懂。
2.3.Tracking.cc中第986行CreateInitialMapMonocular()函数
这个函数基本上没有看懂,尤其后面计算地图点的平均观测方向和观测距离范围,以及两帧变换的归一化等等,都不是很懂。
3.关键帧
3.1.KeyFrame.cc添加共视关系
看这文件的第485行,给当前帧的共视关键帧添加共视关系的时候,是筛选了>15的阈值的关键帧才添加共视关系。
再看第521行,自己这一帧记录共视关系的时候,就直接把KFcounter赋值给mConnectedKeyFrameWeights了,而KFcounter中是有共视关系<15的关键帧的,这样不就导致当前帧的共视记录和其他帧的共视记录不对等了吗?而且另外两个成员变量mvpOrderedConnectedKeyFrames和mvOrderedWeights也是在>15的共视关系中排序得到的。所以感觉这里像是mConnectedKeyFrameWeights的赋值有点问题
4.特征匹配
一个写的比较好的博客:ORB-SLAM2代码(四)特征点匹配
4.1.计算特征点的node id的时候为什么选择第4层?选择最底层可以吗?有什么坏处呢?
搜索范围的大小是根据leave up来确定的,也就是层数来确定的,leave up 越大,那么一个node包含的特征点数量越多,搜索范围越广,速度越慢。leave up值越小,搜索范围越小,速度越快,但是能够匹配的特征点越少。