ptam程序流程
程序運(yùn)行基本流程: Step1: System::System(){ ?1、注冊(cè)一系列命令、添加相對(duì)應(yīng)的功能按鈕。 ?2、創(chuàng)建攝像機(jī)mpCamera = new ATANCamera("Camera"); 實(shí)現(xiàn)的功能包括:加載camera.cfg配置文件中的攝像機(jī)內(nèi)參(mvFocal[0]、mvFocal[1]、mvCenter[0]、mvCenter[1])及攝像機(jī)扭曲變形參數(shù)mdW、設(shè)置黑白圖像及彩色圖像尺寸、計(jì)算從圖像坐標(biāo)系到z=1屏幕投影及相應(yīng)像素大小、找出在z=1平面內(nèi)的邊界四邊形并計(jì)算線性投影所需參數(shù)。 3、創(chuàng)建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、初始化游戲菜單及相應(yīng)功能按鈕。 } NOTE: VideoSource.cc中的代碼主要是用于Capture圖像信息,與PTAMM中所用到的算法沒有必然聯(lián)系,因此可以依據(jù)自己的需要進(jìn)行更改。 Step2:?System::Run(){//初始化時(shí)mbDone = false;? 1、判斷Map是否被其他進(jìn)程鎖定或是否處于編輯鎖定狀態(tài),無關(guān)緊要,暫不討論。 ? ? ?? ?if(bWasLocked)? { ??????? mpTracker->ForceRecovery();} 2、PTAMM程序中涉及到兩種圖像(黑白圖像和彩色圖像),其中黑白圖像用于處理追蹤相關(guān)等功能,彩色圖像用于最終的顯示。采集上述兩種圖像:mVideoSource.GetAndFillFrameBWandRGB(mimFrameBW, mimFrameRGB); 3、第一幀時(shí),初始化ARDriver:mpARDriver->Init();這里主要用于生成紋理標(biāo)識(shí)及FrameBuffer,與OpenGL相關(guān),后面補(bǔ)充。 4、設(shè)置窗口相關(guān)屬性: ? ??? mGLWindow.SetupViewport(); ????? mGLWindow.SetupVideoOrtho();
????? mGLWindow.SetupVideoRasterPosAndZoom(); 5、DrawMap及DrawAR狀態(tài)變量的判斷: ? ? ? 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);將獲取到的黑白圖像轉(zhuǎn)換成用于追蹤的關(guān)鍵幀結(jié)構(gòu):mCurrentKF.MakeKeyFrame_Lite(imFrame);這里需要說明的是,PTAMM中關(guān)鍵幀采用“多層級(jí)金字塔形式進(jìn)行存儲(chǔ)與處理pyramid”,究竟是什么意思,后面學(xué)習(xí)會(huì)進(jìn)行補(bǔ)充。只需要明白每一個(gè)層級(jí)是上一個(gè)層級(jí)的下采樣即可,然后針對(duì)于各個(gè)層級(jí)進(jìn)行FAST角點(diǎn)檢測,每一個(gè)層級(jí)的閾值有所不同。最后生成按列角點(diǎn)查詢表,便于以后近鄰角點(diǎn)的查詢?nèi)蝿?wù): ? ? ??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、更新小圖片用于旋轉(zhuǎn)估計(jì),后面僅使用關(guān)鍵幀結(jié)構(gòu)的圖像進(jìn)行處理-->通過判斷mbDraw狀態(tài)為true,繪制0級(jí)金字塔圖像及角點(diǎn)(這里的角點(diǎn)可能暫不繪制)。 8、通過判斷還沒有map生成,初始化map:TrackForInitialMap();生成圖狀態(tài)查詢,對(duì)應(yīng)于界面中的SpaceBar,TRAIL_TRACKING_NOT_STARTED。進(jìn)入TrailTracking_Start();隨后點(diǎn)擊SpaceBar兩次,initialStereInformation,繪制網(wǎng)格等。 }
? ? ?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、初始化游戲菜單及相應(yīng)功能按鈕。 } NOTE: VideoSource.cc中的代碼主要是用于Capture圖像信息,與PTAMM中所用到的算法沒有必然聯(lián)系,因此可以依據(jù)自己的需要進(jìn)行更改。 Step2:?System::Run(){//初始化時(shí)mbDone = false;? 1、判斷Map是否被其他進(jìn)程鎖定或是否處于編輯鎖定狀態(tài),無關(guān)緊要,暫不討論。 ? ? ?? ?if(bWasLocked)? { ??????? mpTracker->ForceRecovery();} 2、PTAMM程序中涉及到兩種圖像(黑白圖像和彩色圖像),其中黑白圖像用于處理追蹤相關(guān)等功能,彩色圖像用于最終的顯示。采集上述兩種圖像:mVideoSource.GetAndFillFrameBWandRGB(mimFrameBW, mimFrameRGB); 3、第一幀時(shí),初始化ARDriver:mpARDriver->Init();這里主要用于生成紋理標(biāo)識(shí)及FrameBuffer,與OpenGL相關(guān),后面補(bǔ)充。 4、設(shè)置窗口相關(guān)屬性: ? ??? mGLWindow.SetupViewport(); ????? mGLWindow.SetupVideoOrtho();
????? mGLWindow.SetupVideoRasterPosAndZoom(); 5、DrawMap及DrawAR狀態(tài)變量的判斷: ? ? ? 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);將獲取到的黑白圖像轉(zhuǎn)換成用于追蹤的關(guān)鍵幀結(jié)構(gòu):mCurrentKF.MakeKeyFrame_Lite(imFrame);這里需要說明的是,PTAMM中關(guān)鍵幀采用“多層級(jí)金字塔形式進(jìn)行存儲(chǔ)與處理pyramid”,究竟是什么意思,后面學(xué)習(xí)會(huì)進(jìn)行補(bǔ)充。只需要明白每一個(gè)層級(jí)是上一個(gè)層級(jí)的下采樣即可,然后針對(duì)于各個(gè)層級(jí)進(jìn)行FAST角點(diǎn)檢測,每一個(gè)層級(jí)的閾值有所不同。最后生成按列角點(diǎn)查詢表,便于以后近鄰角點(diǎn)的查詢?nèi)蝿?wù): ? ? ??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、更新小圖片用于旋轉(zhuǎn)估計(jì),后面僅使用關(guān)鍵幀結(jié)構(gòu)的圖像進(jìn)行處理-->通過判斷mbDraw狀態(tài)為true,繪制0級(jí)金字塔圖像及角點(diǎn)(這里的角點(diǎn)可能暫不繪制)。 8、通過判斷還沒有map生成,初始化map:TrackForInitialMap();生成圖狀態(tài)查詢,對(duì)應(yīng)于界面中的SpaceBar,TRAIL_TRACKING_NOT_STARTED。進(jìn)入TrailTracking_Start();隨后點(diǎn)擊SpaceBar兩次,initialStereInformation,繪制網(wǎng)格等。 }
總結(jié)
- 上一篇: 求林夕经典歌词。
- 下一篇: ORB-SLAM论文翻译