劉子桓
(四川大學(xué)計算機學(xué)院,成都 610065)
隨著信息技術(shù)的不斷發(fā)展,校園信息化水平不斷提升,智慧校園建設(shè)應(yīng)運而生??梢暬侵腔坌@信息化的基礎(chǔ),通過可視化系統(tǒng)既能向師生展示校園風(fēng)貌,又能方便校方對校園進行管理。因此,研究實現(xiàn)校園可視化系統(tǒng)具有重大意義。
實現(xiàn)校園可視化需要校園的模型數(shù)據(jù),然而通過手工建模的方式創(chuàng)建校園模型需要花費大量的人力和時間,不能滿足智慧校園可視化建設(shè)需求。近年來,隨著無人機技術(shù)的飛速發(fā)展,對可視化建模提供了巨大支持[1]。無人機技術(shù)結(jié)合傾斜攝影測量技術(shù),改變了以往遙感影像只能從單一方向拍攝的現(xiàn)狀,實現(xiàn)多臺設(shè)備從不同的角度進行數(shù)據(jù)采集的功能[2]。通過使用搭載多臺傾斜攝影測量設(shè)備的無人機,能準確、真實客觀地反映校園實際情況,滿足了快速生成校園三維模型的需求。同時,隨著硬件不斷升級以及計算機圖形學(xué)的快速發(fā)展,以O(shè)penSceneGraph為代表的一系列場景可視化系統(tǒng)和渲染引擎日益成熟[3]。三維數(shù)據(jù)可視化技術(shù)不斷進步,為實現(xiàn)校園可視化建設(shè)提供了巨大幫助。
本文以實現(xiàn)智慧校園建設(shè)中校園可視化目標,設(shè)計實現(xiàn)一套可視化系統(tǒng)用于校園模型數(shù)據(jù)可視化。校園模型數(shù)據(jù)來自于無人機拍攝的校園影像,系統(tǒng)以O(shè)penSceneGraph作為三維渲染引擎,對校園模型數(shù)據(jù)進行調(diào)度、渲染。同時,為了更好地向用戶展示校園風(fēng)貌,系統(tǒng)支持場景漫游功能,用戶能選擇不同的漫游方式,在校園場景中進行漫游。
傾斜攝影測量與正射影像測量不同,正射影像測量只能從單一角度對物體進行拍攝。而使用搭載多個相機的飛行平臺,能同時從垂直方向和四個傾斜方向五個不同角度采集數(shù)據(jù)[4]。同時傾斜攝影測量技術(shù)具有體量小、真實度高、花費低等特點,在場景可視化建設(shè)中能快速收集數(shù)據(jù),降低場景三維建模成本。與此同時,由于傾斜攝影測量技術(shù)采用多個相機進行拍攝,在建模時紋理可以批量提取,相比正射影像測量后期需要手工處理紋理偏差付出的代價小很多。
傾斜攝影測量技術(shù)日漸成熟,處理傾斜攝影測量數(shù)據(jù)的軟件也推陳出新。目前,處理傾斜攝影測量數(shù)據(jù)的軟件市場大都是由國外公司把控,主要代表有法國Acute3D的Smart3DCapture、美國Pictometry公司的Pictometry系統(tǒng)、徠卡公司的LPS[5]工作站等。通過這些軟件,能將傾斜攝影測量得到的數(shù)據(jù)進行自動處理,快速地生成場景模型。通常來說,上述軟件通過傾斜攝影測量數(shù)據(jù)進行三維場景建模一般包括以下幾個步驟:
(1)獲取原始數(shù)據(jù):一般來說,通過傾斜攝影測量數(shù)據(jù)進行三維場景建模需要正射影像、傾斜影像以及POS(Position and Orientation System)數(shù)據(jù)三種數(shù)據(jù),這些數(shù)據(jù)都能由無人機的各種傳感器提供。
(2)原始數(shù)據(jù)處理:主要是對正射影像、傾斜影像進行篩選,通過空中三角測量計算(Aerotriangulation)、幾何糾正等手段將原始數(shù)據(jù)轉(zhuǎn)化為大規(guī)模的點云數(shù)據(jù)。
(3)模型構(gòu)建:有了大規(guī)模點云數(shù)據(jù),就能通過點云的拼接和重建技術(shù)實現(xiàn)點云的三維重建,生成幾何模型。然后將得到幾何模型通過原始影像進行紋理映射,最后即可輸出具有真實感的場景三維模型。
經(jīng)過以上幾個步驟,就能實現(xiàn)拍攝的傾斜攝影圖像到三維場景建模的轉(zhuǎn)化。圖1顯示了通過傾斜攝影技術(shù)進行三維場景建模的一般流程。
OpenSceneGraph是一個基于工業(yè)圖形標準OpenGL的高層次圖形開發(fā)API接口。通過它,程序員能更加快速便捷地創(chuàng)建高性能、跨平臺的交互式圖形程序[6]。作為一個開源圖形引擎,OpenSceneGraph具有很多封裝庫,通過這些庫提供的功能,用戶能方便地開發(fā)程序,實現(xiàn)自己的需求。常用的庫有以下幾種[7]:
(1)osg庫:它包含OpenSceneGraph引擎的核心內(nèi)容,提供三維引擎所需的一些基本功能,定義一些數(shù)據(jù)結(jié)構(gòu),如用于向量和矩陣運算的類,以及用于描述渲染狀態(tài)的類等等。
(2)osgDB庫:它包含文件處理和加載部分,通過它能實現(xiàn)對文件讀寫以及模型處理相關(guān)功能。一般來說用于場景可視化的數(shù)據(jù)量都比較大,直接對整個場景進行渲染是不可能的。osgDB中的DatabasePager提供了對數(shù)據(jù)進行管理的方式,在實際渲染過程中加載不同的細節(jié)層次(Level Of Detail,LOD)模型進行渲染,同時使用PagedLOD技術(shù)[8]對過期的模型進行卸載并從內(nèi)存中移除,保證內(nèi)存不會超出限制。
(3)osgGA庫:它是提供交互控制功能的部分,通過它能實現(xiàn)平臺無關(guān)的用戶交互控制。
(4)osgViewer庫:它提供渲染相關(guān)功能,包括場景、視口、視窗等相關(guān)部分。
由以上幾個模塊,可以組成一個具備基礎(chǔ)交互功能的渲染程序,它的基本結(jié)構(gòu)如圖2所示。
圖2 基于OpenSceneGraph的渲染程序示意圖
為了實現(xiàn)校園可視化系統(tǒng),首先需要得到校園的模型數(shù)據(jù)。本文通過搭載多個相機和多種傳感器的無人機進行對校園進行數(shù)據(jù)采集,通過傾斜攝影測量技術(shù),獲取用于建模的數(shù)據(jù)。為了取得傾斜攝影測量數(shù)據(jù),需要事先規(guī)劃無人機飛行線路,將無人機運行軌跡設(shè)定好。本文數(shù)據(jù)采集使用了無人機的往返飛行模式,無人機在設(shè)定好的路線往返飛行,并且在每次掉頭同時移動一定的偏移量,達到對一片區(qū)域覆蓋拍攝的目的。同時,為保證良好的拍攝效果,將無人機飛行高度設(shè)定在距地面30至50米上空,并將相機光圈值設(shè)定為f/5、曝光時間為1/320秒進行拍攝。
本文通過無人機進行傾斜攝影測量方式,對校園進行了拍攝,實際采集到有效數(shù)據(jù)共計6967張圖片,每張圖片分辨率為5472×3648,共計為大小55.4GB。
為了處理通過無人機拍攝的傾斜攝影測量數(shù)據(jù),本文采用Smart3DCapture對采集到的數(shù)據(jù)進行自動建模處理。實現(xiàn)傾斜攝影測量數(shù)據(jù)自動建模步驟如下:
(1)導(dǎo)入數(shù)據(jù):將拍攝數(shù)據(jù)導(dǎo)入到Smart3DCapture中。因為軟件一次能處理的數(shù)據(jù)量有限(不能超過30G像素),加之實驗環(huán)境硬件設(shè)備的限制,本文將拍攝到的6967張圖片分成7個數(shù)據(jù)包分別處理,每個數(shù)據(jù)包約為1000張圖片,大小在8GB左右,大約有20G像素。
(2)空中三角測量計算:將拍攝數(shù)據(jù)導(dǎo)入到Smart3DCapture中后,Smart3DCapture會根據(jù)圖片帶有的POS信息進行空中三角測量計算。它會進行關(guān)鍵點提取,分析POS數(shù)據(jù),得到點云數(shù)據(jù)。
(3)三維重建及紋理映射處理:將得到的點云數(shù)據(jù)進行三維重建,產(chǎn)生如圖3所示的網(wǎng)格模型。完成后再進行紋理映射處理即可輸出模型數(shù)據(jù)。輸出模型文件時會要求選擇輸出的模型格式,本文渲染引擎使用OpenSceneGraph,為了方便使用,輸出的模型文件格式選擇 OpenSceneGraph Binary(OSGB)格式。
圖3 三維重建產(chǎn)生的網(wǎng)格模型
本文將校園可視化系統(tǒng)分為三個模塊進行實現(xiàn),如圖4所示。下面分別介紹各個模塊的具體功能和實現(xiàn)。
圖4 校園可視化系統(tǒng)架構(gòu)示意圖
(1)初始化模塊
初始化模塊對整個系統(tǒng)進行初始化,由以下幾個子模塊組成:
①系統(tǒng)初始化子模塊:系統(tǒng)啟動后會讀取初始化文件InitValue.ini,將文件中記錄系統(tǒng)初始化的內(nèi)容加載到系統(tǒng)中來,并記錄到結(jié)構(gòu)體SInitValue中,之后再通過SInitValue的值對系統(tǒng)進行設(shè)置。SInitValue的聲明如下:
其中WindowWidth和WindowHeight分別為程序窗口寬和高。OSGBFilePath表示使用Smart3DCapture生成的OSGB模型文件所在目錄。BeginTileNumber和EndTileNumber表示加載模型的開始塊序號和終止塊序號,通過這兩個序號可以控制整個校園模型是否全部加載。當BeginTileNumber大于EndTileNumber時認為加載全部模型,其他情況則加載序號為BeginTile-Number到EndTileNumber之間每一個模型塊(Tile)。
②場景瀏覽器初始化子模塊:在系統(tǒng)初始化子模塊完成后,場景瀏覽器初始化子模塊讀取SceneViewer-Config.cfg文件,將場景瀏覽器有關(guān)的設(shè)置加載到系統(tǒng)中來,并完成場景設(shè)置。主要設(shè)置參數(shù)有LightSource和MaximumNumberOfPageLOD兩個。對光源的設(shè)置包括光源的位置、數(shù)量以及它們的Ambient、Diffuse、Specular三種材質(zhì)分量的設(shè)定。MaximumNumberOf-PageLOD則是用來控制OpenSceneGraph中PagedLOD數(shù)量最大值,其作用是防止內(nèi)存占用過多。OpenScene-Graph處理MaximumNumberOfPageLOD的值有兩種情況:當MaximumNumberOfPageLOD被設(shè)置為0時,使用超期刪除模式,DatabasePager會依據(jù)系統(tǒng)運行的幀號刪除過期的LOD子節(jié)點;而當MaximumNumberOf-PageLOD大于0時,使用超過數(shù)量刪除模式,當系統(tǒng)中LOD子節(jié)點數(shù)量大于這個值時,DatabasePager開始刪除內(nèi)存中的LOD子節(jié)點直到LOD子節(jié)點數(shù)量小于MaximumNumberOfPageLOD為止。
③漫游器初始化子模塊:在場景瀏覽器初始化完成之后,漫游器初始化子模塊開始運行,將SceneVisitorConfig.cfg中的內(nèi)容加載到系統(tǒng)中來,記錄到結(jié)構(gòu)體SVisitorConfig中,以便后續(xù)漫游模塊使用。SVisitor-Config的聲明如下:
其中VisitorDefaultPosition表示漫游器的初始位置。VisitStrategy表示使用的漫游模式。ChangeDirectionFrameID、ResetVisitorFrameID、BoundaryWidth以及BoundaryLength是在使用隨機漫游模式時才會生效的值,分別表示每經(jīng)過ChangeDirectionFrameID幀改變漫游器的方向以及每經(jīng)過ResetVisitorFrameID幀重置漫游器位置。BoundaryWidth和BoundaryLength表示邊界長和寬的最大值,當漫游器超出邊界時會隨機重置位置。
(2)渲染模塊
渲染模塊由OpenSceneGraph完成。在Open-SceneGraph引擎中,一次渲染循環(huán)過程主要由Viewer-Base對象響應(yīng)事件、更新場景圖以及對場景圖進行渲染三個部分組成。它采用遍歷的方式,對不同的過程做出不同的響應(yīng)。
在校園可視化系統(tǒng)中,通過渲染模塊對系統(tǒng)初始化子模塊中加載的模型塊進行響應(yīng),系統(tǒng)遍歷所有加載的模型塊,完成渲染工作。對于這些模型塊來說,它們在校園可視化系統(tǒng)的渲染模塊中會經(jīng)過以下處理步驟:
①事件遍歷:事件遍歷就是對Viewer的實際操作做出響應(yīng),包括UI的控制、鍵盤的響應(yīng)、相機的回調(diào)等操作。在校園可視化系統(tǒng)中,沒有太多復(fù)雜的事件需要響應(yīng)。除去響應(yīng)計時器對遍歷事件開始的時間和結(jié)束時間的記錄操作外,主要響應(yīng)的操作是通過漫游控制模塊傳入的對相機進行的鍵盤操作、鼠標操作以及窗口大小改變等UI控制操作。
②更新遍歷:更新遍歷主要完成對場景圖的更新。在校園可視化系統(tǒng)中,主要是通過DatabasePager對模型塊進行內(nèi)存管理,包括刪除過期模型塊的LOD子節(jié)點,加入新的期望顯示模型塊的LOD子節(jié)點等操作。
③渲染遍歷:渲染遍歷主要完成對場景圖的渲染相關(guān)工作。在校園可視化系統(tǒng)中,主要是包括對場景中視錐體外的模型進行剔除,對需要渲染的節(jié)點進行渲染兩個基本功能。
(3)漫游控制模塊
漫游控制模塊提供漫游方式控制,包括自由操作模式,隨機漫游模式和指定路線漫游模式。無論是使用哪種漫游方式,漫游控制模塊本質(zhì)上都是通過對相機的View Matrix進行操作,改變相機在場景中的位置以及觀察視角來實現(xiàn)的。下面介紹本文中的三種操作模式具體實現(xiàn)。
①自由操作模式:實現(xiàn)用戶在校園中進行自由漫游的功能。通過響應(yīng)鍵盤按鍵以及鼠標轉(zhuǎn)動實現(xiàn)類似于第一人稱相機操控器的功能。要實現(xiàn)這一功能,首先編寫自己的事件響應(yīng)類CMovementHandler,它繼承自osgGA::GUIEventHandler基類,通過重寫virtual bool handle(const GUIEventAdapter&,GUIActionAdapter&)函數(shù)來實現(xiàn)自己對鍵盤鼠標事件進行響應(yīng)。之后,通過osgViewer::Viewer::addEventHandler(osgGA::EventHandler*)函數(shù)將CMovementHandler加入到事件響應(yīng)隊列中,等待Viewer進行事件遍歷處理事件。
②隨機漫游模式:用戶在設(shè)定漫游模式為隨機漫游模式時,初始化模塊的SVisitorConfig對象會根據(jù)讀入的數(shù)據(jù)設(shè)置隨機漫游的參數(shù)。每當漫游需要改變方向或者重置位置時,漫游控制模塊會產(chǎn)生一個取值范圍為-1到1的浮點隨機數(shù)RandomFloat作為隨機數(shù)因子控制轉(zhuǎn)向方向以及重置位置坐標。這個隨機數(shù)因子采用c++中std標準庫的default_random_engine作為隨機數(shù)產(chǎn)生引擎,采用uniform_real_distribution
③指定線路漫游模式:當漫游模式被設(shè)置為指定線路漫游模式時,系統(tǒng)會加載預(yù)先指定好的路徑文件,再根據(jù)文件的內(nèi)容改變每一幀相機的View Matrix,從而達到按指定線路漫游的目的。同隨機漫游模式一樣,用戶也可以通過按鍵中斷漫游過程,進入自由操作模式。
通過無人機對校園進行數(shù)據(jù)采集,對完成傾斜攝影測量數(shù)據(jù)自動建模,將校園模型數(shù)據(jù)加載到校園可視化系統(tǒng)中進行顯示,得到的系統(tǒng)實際運行效果如圖5所示。
圖5 校園可視化系統(tǒng)實際運行效果圖
校園可視化系統(tǒng)能提供給學(xué)生、家長、教師以及社會各界人士直觀認識學(xué)校的機會,并且在智慧校園建設(shè)中,校園場景的可視化也是重要的一環(huán)。本文基于OpenSceneGraph設(shè)計開發(fā)一套校園可視化系統(tǒng),系統(tǒng)利用無人機拍攝的傾斜攝影測量數(shù)據(jù),使用Smart3DCapture對其進行自動建模,并將創(chuàng)建好的模型加載到OpenSceneGraph中用于可視化。同時,校園可視化系統(tǒng)提供了不同的漫游方式,滿足用戶以多種方式在校園場景中進行漫游的需求。