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