PTAMM阅读笔记之基本流程(一)

本文详细介绍了PTAMM程序的运行流程,从System构造函数的步骤开始,包括摄像机初始化、Map、Tracker等模块的创建,再到Run函数中的图像获取、追踪、绘制等关键操作。特别提到了黑白图像和彩色图像在追踪与显示中的作用,以及关键帧的多层级金字塔处理方式。
摘要由CSDN通过智能技术生成
程序运行基本流程:
Step1: System::System(){
 1、注册一系列命令、添加相对应的功能按钮。
 2、 创建摄像机 mpCamera = new ATANCamera("Camera"); 实现的功能包括:加载camera.cfg配置文件中的摄像机内参(mvFocal[0]、mvFocal[1]、mvCenter[0]、mvCenter[1])及摄像机扭曲变形参数mdW、设置黑白图像及彩色图像尺寸、计算从图像坐标系到z=1屏幕投影及相应像素大小、找出在z=1平面内的边界四边形并计算线性投影所需参数。
3、 创建Map、MapMaker、Tracker、ARDriver、MapViewer、MapSerialize。
      mpMap = new Map();
     mvpMaps.push_back( mpMap );
     mpMap->mapLockManager.Register(this);
     mpMapMaker = new MapMaker( mvpMaps, mpMap );
     mpTracker = new Tracker(mVideoSource.Size(), *mpCamera, mvpMaps, mpMap, *mpMapMaker);
     mpARDriver = new ARDriver(*mpCamera, mVideoSource.Size(), mGLWindow, *mpMap);
     mpMapViewer = new MapViewer(mvpMaps, mpMap, mGLWindow);
     mpMapSerializer = new MapSerializer( mvpMaps );
4、初始化游戏菜单及相应功能按钮。
}
NOTE: VideoSource.cc中的代码主要是用于Capture图像信息,与PTAMM中所用到的算法没有必然联系,因此可以依据自己的需要进行更改。
Step2: System::Run(){//初始化时mbDone = false; 
1、判断Map是否被其他进程锁定或是否处于编辑锁定状态,无关紧要,暂不讨论。
        if(bWasLocked)  {
        mpTracker->ForceRecovery();}
2、PTAMM程序中涉及到两种图像(黑白图像和彩色图像),其中黑白图像用于处理追踪相关等功能,彩色图像用于最终的显示。采集上述两种图像: mVideoSource.GetAndFillFrameBWandRGB(mimFrameBW, mimFrameRGB);
3、第一帧时,初始化ARDriver:mpARDriver->Init();这里主要用于生成纹理标识及FrameBuffer,与OpenGL相关, 后面补充。
4、设置窗口相关属性:
      mGLWindow.SetupViewport();
      mGLWindow.SetupVideoOrtho();
      mGLWindow.SetupVideoRasterPosAndZoom();
5、DrawMap及DrawAR状态变量的判断:
      static gvar3<int> gvnDrawMap("DrawMap", 0, HIDDEN|SILENT);
      static gvar3<int> gvnDrawAR("DrawAR", 0, HIDDEN|SILENT);
      bool bDrawMap = mpMap->IsGood() && *gvnDrawMap;
      bool bDrawAR = mpMap->IsGood() && *gvnDrawAR;
6、开始追踪黑白图像: mpTracker->TrackFrame(mimFrameBW, !bDrawAR && !bDrawMap); 将获取到的黑白图像转换成用于追踪的关键帧结构: mCurrentKF.MakeKeyFrame_Lite(imFrame); 这里需要说明的是,PTAMM中关键帧采用“ 多层级金字塔形式进行存储与处理pyramid ”, 究竟是什么意思,后面学习会进行补充。 只需要明白每一个层级是上一个层级的下采样即可,然后针对于各个层级进行FAST角点检测,每一个层级的阈值有所不同。最后生成按列角点查询表,便于以后近邻角点的查询任务:
      unsigned int v=0;
      lev.vCornerRowLUT.clear();
      for(int y=0; y<lev.im.size().y; y++)
     {
       while( (v < lev.vCorners.size()) && (y > lev.vCorners[v].y) )
         v++;
       lev.vCornerRowLUT.push_back(v);
     }
7、更新小图片用于旋转估计,后面仅使用关键帧结构的图像进行处理-->通过判断mbDraw状态为true,绘制0级金字塔图像 及角点(这里的角点可能暂不绘制)。
8、通过判断还没有map生成,初始化map: TrackForInitialMap(); 生成图状态查询,对应于界面中的SpaceBar, TRAIL_TRACKING_NOT_STARTED。 进入 TrailTracking_Start(); 随后点击SpaceBar两次,initialStereInformation,绘制网格等。
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值