目录
1.函数作用
2.到这步之前我们做了什么
3.code
4.函数解析
1.函数作用
哈哈哈,这其实应该是这个专栏的第一篇文章,也没什么必要写,但是我怕大家看的时候对单目还没有初始化没有进入跟踪线程前面比较懵逼,所以我补了此内容。
这篇博客主要写的就是追踪线程前的工作。
这个函数的主要作用是输入左目RGB或RGBA图像,输出世界坐标系到该帧相机坐标系的变换矩阵。
2.到这步之前我们做了什么
我们思考以下从输入命令行到这个函数系统都做了什么?
我们在ORB-SLAM2根目录下输入命令后:
./Examples/Monucular/mono_tum ./Vocabulary/ORBvoc.txt ./Examples/Monucular/TUMX.yaml data/rgbd_dataset_freiburg1_xyz
系统读取我们输入的参数到单目的main函数:mono_tum.cc中
将数据集中的图片索引转化成图片+时间戳的形式存放在vstrImageFilenames容器和vTimestamps容器中,这个过程请参阅我的一篇博客:
ORB-SLAM2 ---- LoadImages函数解析https://blog.csdn.net/qq_41694024/article/details/126285573 随后,SLAM系统将每帧图片im(vstrImageFilenames容器中的一帧图像)和它对应的时间戳tframe(vTimestamps容器的一个float型变量)传入单目SLAM的函数的单目追踪器接口System::TrackMonocular中。
SLAM.TrackMonocular(im,tframe);
由于SLAM系统最终输出的是相机的位姿,因此System::TrackMonocular函数是追踪函数的祖先,它要向SLAM主函数返回当前帧im的位姿,它的返回值为cv::Mat型即相机相对于第一帧的3D坐标。
而这个函数得到位姿的前提又是调用我们这节所讲的函数Tracking::GrabImageMonocular通过调用追踪线程Tracking::track而得到单帧的位姿。
3.code
cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double ×tamp) { mImGray = im; // Step 1 :将彩色图像转为灰度图像 //若图片是3、4通道的,还需要转化成灰度图 if(mImGray.channels()==3) { if(mbRGB) cvtColor(mImGray,mImGray,CV_RGB2GRAY); else cvtColor(mImGray,mImGray,CV_BGR2GRAY); } else if(mImGray.channels()==4) { if(mbRGB) cvtColor(mImGray,mImGray,CV_RGBA2GRAY); else cvtColor(mImGray,mImGray,CV_BGRA2GRAY); } // Step 2 :构造Frame //判断该帧是不是初始化 if(mState==NOT_INITIALIZED || mState==NO_IMAGES_YET) //没有成功初始化的前一个状态就是NO_IMAGES_YET mCurrentFrame = Frame( mImGray, timestamp, mpIniORBextractor, //初始化ORB特征点提取器会提取2倍的指定特征点数目 mpORBVocabulary, mK, mDistCoef, mbf, mThDepth); else mCurrentFrame = Frame( mImGray, timestamp, mpORBextractorLeft, //正常运行的时的ORB特征点提取器,提取指定数目特征点 mpORBVocabulary, mK, mDistCoef, mbf, mThDepth); // Step 3 :跟踪 Track(); //返回当前帧的位姿 return mCurrentFrame.mTcw.clone(); }
4.函数解析
这个函数是为了将我们的图片传入追踪线程的帧做准备的。
mImGray是一个cv::Mat型的变量,我们将SLAM主函数向下传的帧im复制到mImGray变量中,将彩色图像转为灰度图像。
然后构造当前帧,构造之前判断下SLAM系统是否初始化完成:
它们的主要区别在于提取特征点的数目不同,若用mpIniORBextractor类型的ORBMatcher则会提取到更多的特征点,我们初始化时希望提取更多的特征点保证SLAM系统的稳定性。
Frame::Frame(const cv::Mat &imGray, const double &timeStamp, ORBextractor* extractor,ORBVocabulary* voc, cv::Mat &K, cv::Mat &distCoef, const float &bf, const float &thDepth) :mpORBvocabulary(voc),mpORBextractorLeft(extractor),mpORBextractorRight(static_cast<ORBextractor*>(NULL)), mTimeStamp(timeStamp), mK(K.clone()), mDistCoef(distCoef.clone()), mbf(bf), mThDepth(thDepth)
构造的参数分别是如下含义:
* @param[in] imGray //灰度图
* @param[in] timeStamp //时间戳
* @param[in & out] extractor //ORB特征点提取器的句柄
* @param[in] voc //ORB字典的句柄
* @param[in] K //相机的内参数矩阵
* @param[in] distCoef //相机的去畸变参数
* @param[in] bf //baseline*f
* @param[in] thDepth //区分远近点的深度阈值初始化完成当前帧后,我们将此帧送入追踪现场Tracking::track计算出当前帧的位姿后返回给我们的函数相机的位姿,此函数向上返回输出位姿给TrackMonocular函数作为SLAM系统的输出。