程序运行基本流程:
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;
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,绘制网格等。
}