FrameDrawer
成员函数
- FrameDrawer::FrameDrawer(Map* pMap):mpMap(pMap)
构造函数,初始化图像显示画布
mIm = cv::Mat(480,640,CV_8UC3, cv::Scalar(0,0,0));
- cv::Mat FrameDrawer::DrawFrame()
准备需要显示的信息,包括图像、特征点、地图、跟踪状态
分为三种情况:
SLAM没有初始化时获取当前帧和参考帧的特征点,并得到他们的匹配关系,
if(mState==Tracking::NOT_INITIALIZED)
{
vCurrentKeys = mvCurrentKeys;
vIniKeys = mvIniKeys;
vMatches = mvIniMatches;
}
当系统处于运动追踪状态时,获取当前帧特征点和后者是表示地图中没有出现,但是在当前帧中是第一次被观测得到的点,已经当前帧的特征点在地图中是否出现的标记,
else if(mState==Tracking::OK)
{
vCurrentKeys = mvCurrentKeys;
vbVO = mvbVO;
vbMap = mvbMap;
}
跟丢的时候直接获取当前帧特征点
else if(mState==Tracking::LOST)
{
vCurrentKeys = mvCurrentKeys;
}
绘制
- 如果没有初始化,绘制当前帧特征点到下一帧特征点的连线,其实就是匹配关系,就是当初看到的
if(vMatches[i]>=0)
{
cv::line(im,vIniKeys[i].pt,vCurrentKeys[vMatches[i]].pt,
cv::Scalar(0,255,0));
}
- 追踪状态时,遍历每个特征点,如果追踪成功则特征点附近画个正方向圈住
for(int i=0;i<n;i++)
{
//如果这个点在视觉里程计中有(应该是追踪成功了的意思吧),在局部地图中也有
if(vbVO[i] || vbMap[i])
{
//在特征点附近正方形选择四个点
cv::Point2f pt1,pt2;
pt1.x=vCurrentKeys[i].pt.x-r;
pt1.y=vCurrentKeys[i].pt.y-r;
pt2.x=vCurrentKeys[i].pt.x+r;
pt2.y=vCurrentKeys[i].pt.y+r;
// This is a match to a MapPoint in the map
// 正常跟踪时,在画布im中标注特征点
if(vbMap[i])
{
// 通道顺序为bgr,地图中MapPoints用绿色圆点表示,并用绿色小方框圈住
cv::rectangle(im,pt1,pt2,cv::Scalar(0,255,0));
cv::circle(im,vCurrentKeys[i].pt,2,cv::Scalar(0,255,0),-1);
mnTracked++;
}
//BUG 但是不知道为什么,我在实际运行中时没有发现有蓝色的点存在啊
else // This is match to a "visual odometry" MapPoint created in the last frame
{
// 通道顺序为bgr, NOTICE 仅当前帧能观测到的MapPoints用蓝色圆点表示,并用蓝色小方框圈住
cv::rectangle(im,pt1,pt2,cv::Scalar(255,0,0));
cv::circle(im,vCurrentKeys[i].pt,2,cv::Scalar(255,0,0),-1);
mnTrackedVO++;
}
}
}
- void FrameDrawer::DrawTextInfo(cv::Mat &im, int nState, cv::Mat &imText)
绘制状态栏上的文本信息,输入参数分别为图像,状态和得到的扩展图像,根据不同状态显示不同文字同时对图像扩展显示状态量上的文本信息 - void FrameDrawer::Update(Tracking *pTracker)
将跟踪线程的数据拷贝到绘图线程(图像、特征点、地图、跟踪状态)
Viewer
成员函数
- 查看器的构造函数
Viewer::Viewer(System* pSystem, FrameDrawer *pFrameDrawer, MapDrawer *pMapDrawer, Tracking *pTracking, const string &strSettingPath):
mpSystem(pSystem), mpFrameDrawer(pFrameDrawer),mpMapDrawer(pMapDrawer), mpTracker(pTracking),
mbFinishRequested(false), mbFinished(true), mbStopped(false), mbStopRequested(false)
从配置文件中读取各种参数 - 查看器的主要函数
void Viewer::Run()
利用pangolin创建窗口,新建按钮选择框,设置观测方向向量 - 利用MapDrawer绘制当前相机 关键帧和共视图 地图点
- 利用FrameDrawer绘制当前帧图像和特征点提取匹配结果
网友评论