ORB-SLAM2代码阅读笔记:FrameDrawer&View

2019-08-21  本文已影响0人  liampayne_66d0

FrameDrawer

成员函数

    mIm = cv::Mat(480,640,CV_8UC3, cv::Scalar(0,0,0));
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++;
            }
        }
    }

Viewer

成员函数

上一篇 下一篇

猜你喜欢

热点阅读