ARToolkit是一款專門為用戶打造的開源sdk工具,采用c/c++編寫,幫助開發者快速增強現實感,方便快捷,有需要的朋友們千萬別錯過.
要使用 ARToolKit 開發應用有兩個部分:編寫應用程序,以及訓練對增強現實應用中所用到的真實世界標誌的圖像處理例程。
使用 ARToolKit 編寫應用是很簡單的:新建一個 AR 應用需要一個簡單的框架。我們在這個框架的基礎上編寫新的應用。同樣地,因為應用這個簡單的框架,訓練模板的過程也被簡化。
一個應用程序的主代碼必須包含以下步驟:
第二步到第五步一直重複,直到應用程序退出。但是步驟一和步驟六隻分別在應用程序的初始化時和關閉時才執行。除了這些步驟之外,一個應用程序還應該對鼠標、鍵盤或者其他的特殊事件響應。
主要過程:Introduction main init mainLoop draw cleanup
為了詳細地示範怎麼樣開發一個 ARToolKit 的應用,我們將一步步地介紹一個現有的例程的源代碼:simpleTest(或者在有的版本裏是 simple)。可以在目錄 examples/simple/裏找到這個程序。
程序 simpleTest
我們要找的文件名字是 simpleTest.c (或者 simple.c )。這個程序僅僅包含了一個主函數和幾個繪製圖像的函數。
相應於上節介紹的六個應用步驟的函數列出在表 1 中。相應於步驟二到步驟五的函數在 mainLoop 函數(主循環)中被調用。
表格 1:相應於 ARToolKit 應用程序步驟的函數調用和代碼
在這個程序中,最重要的函數是 main ,init , mainloop ,draw 和 cleanup。在本節的其他部分我們將詳細地解釋這些函數調用。
main
Simple 例程中 main 函數的流程如下所示:
其中的初始化例程 init 包含的代碼可以初始化視頻捕捉,讀取標識卡信息和攝像機參數信息,以及設置圖像窗口。這相對於《開發原則》中的第一步。接下來,我們通過調用視頻開始函數 arVideoCapStart 輸入實時狀態。再接著,函數 argMainLoop 被調用,這個函數啟動了主要的程序循環,通過鍵盤事件與函數 keyEvent 結合使用,通過主要的圖像顯示循環與 mainLoop 結合使用。函數 argMainLoop 的定義在文件 ggsub.c 中。
init
init 例程在 main 例程中被調用,它的作用是初始化視頻捕捉以及讀入 ARToolKit 應用的初始參數信息。
首先,視頻通道被打開,確定視頻圖像大小:
變量 vconf 包含了初始視頻的配置,在 simple.c 的頂部被定義。但它的內容在你的平台的函數裏可能很不一樣:參照視頻配置鏈接。對於每一個平台,都定義了一個默認的字符串,這個字符串一般都打開你的應用程序結構中第一個可用的視頻流。
然後,我們需要初始化 ARToolKit 應用程序的參數。對於 ARToolKit 應用程序來說,關鍵的參數是:
● 可能被用來進行模板模式匹配的模板信息,以及這些模板鎖對應的虛擬物體。
● 所用的視頻攝像機的相機特性參數。
這些都是從文件裏讀取,這些文件的名字可以在命令行裏被指定,或使用硬件編碼的文件的默認名稱。
因此,攝像機的參數信息通過默認的攝像機參數文件名 Data/camera_para.dat 被讀入:
接下來,這些參數根據現有的圖像大小被轉換,因為攝像機的參數根據圖像的大小而改變,甚至是使用相同的攝像機。
攝像機的參數被讀入它的程序設置,攝像機的參數被輸出顯示到屏幕上:
這樣之後我們通過默認的模板文件 Data/patt.hiro 讀入模板的定義信息:
其中 patt_id 是一個已經被識別的模板的鑒定信息(告訴我們是哪一個模板,相當於人類的身份證)。
最終打開了圖像窗口:
函數 arginit 的第二個參數定義了一個縮放函數,適應視頻圖像格式時的值設為 1.0,值設為 2.0 時是雙倍大小(比如說,輸入 320*240 圖像,輸出為 VGA AR 格式)。
mainloop
ARToolKit 應用程序的大部分調用都在這個例程裏完成,這個例程包含了相對於《開發原則》中所要求的步驟二到步驟五。首先通過函數 arVideoGetImage 來捕捉一個輸入視頻幀:
該視頻圖像立即被輸出顯示到屏幕上。這個圖像可以是一幅沒有被扭曲的圖像,也可以是一幅根據攝像頭的失真信息被扭曲修正。扭曲以修正圖像可以生成更加正常的圖像,但是可能會導致視頻幀的速率明顯降低。在下例中圖像是已經被扭曲的:
接著函數 arDetectMarker 被使用以搜索整個圖像來尋找含有正確的標識模板的方塊:
找到的標識卡的數量被存放在變量 marker_num 裏,同時 marker_info 是一個指向一列z識結構體的指針,這個結構體包含了坐標信息,識別可信度,以及每個標識對應的鑒定信息和物體。marker_info 的詳細信息在 API documentation 中。
此時,視頻圖像已經被顯示和分析了。所以我們不需要再使用它:我們可以在使用新的函數的同時使用幀捕捉器來啟動一個新的幀捕捉操作。完成這些工作,你隻需要調用函數 arVideoCapNext:
備注:當你調用這個函數時,使用上一個視頻圖像緩衝會導致壞的結果(根據你的應用程序平台而定)。確保你已經處理好了視頻圖像緩衝。
接下來,所有的已經探測到的標識的可信度信息被加以比較,最終確定正確的標識鑒定信息為可信度最高的標識的鑒定信息:
標識卡和攝像機之間的轉移信息可以通過使用函數 arGetTransMat 來獲取:
相對於標識物體 i 的真實的攝像機的位置和姿態包含在一個 3*4 的矩陣 patt_trans 中。
最後,使用繪圖函數,虛擬物體可以被疊加在標識卡上:
備注:如果沒有標識被找到(k==-1),應用程序會做一個簡單的優化步驟,我們可以交換緩衝器而不需要調用函數 draw,然後返回:
draw
函數 draw 分為顯示環境初試化,設置矩陣,顯示物體幾個部分。你可以使用 ARToolKit顯示一個三維物體並設置最小的 OpenGL 狀態來初始化一個 3d 顯示:
在這之後你需要這個把轉移矩陣(3*4 的矩陣)轉化成 OpenGL 適用的格式(16 個值的向量),可用函數 argConvGlpara 來完成此功能。這十六個值是真實世界的攝像機的位置和姿態信息,因此利用這些信息可以設置虛擬世界攝像機的位置,因此任何的圖形物體都可以被準確地放置在相應的真實標識卡上。
虛擬世界的攝像機的位置是用函數 glLoadMatrixd(gl_para)來設置的。代碼的最後是三維物體的顯示。在這個例子中,顯示的是白色光束下是一個藍色立方體:
在最後,你要重置某些 OpenGL 的參數為默認值:
上述所講到的步驟出現並貫穿了主要顯示函數的始終,當這個程序在運行時,鼠標事件被鼠標事件函數控製,鍵盤事件被鍵盤函數控製。
cleanup
函數 cleanup 被調用的作用的停止視頻處理以及關閉視頻路徑並釋放它使其他的應用可以使用:
這些工作可以使用函數 arVideoCapStop, arVideoClose 和 argCleanup 來完成。
你可以編譯這個程序並運行它!
這個程序的一個限製的,它隻使用模板 Hiro:使用其他多個模板是很有趣的!我們將在下一節介紹怎麼樣使用其他模板。
使用其他的模板
程序 simpletest 使用模板匹配法來識別標識方框中的 Hiro 字樣。輸入視頻流中的方塊被係統與之前訓練過的模板相比較。這些模板在運行時被加載,包含在 bin 目錄下的名為data 的目錄下。這這個目錄下,我們找到了上次應用程序所用到的文件,比如說,名字為patt.hiro。這個文件包含了模板的格式,僅僅是一個樣本圖案。
為了改變 simpletest 中識別的模板,你需要改動你的代碼,創造一個新的模板文件。
你可以通過改變夾在文件夾名字來修改 simpletest.c 文件,將:
改為:
這段程序生成的新的模板文件名為 mk_patt,包含在 bin 目錄下。mk_patt 的源代碼在util 目錄下的文件 mk_patt.c 裏。
要創建一個新的模板,首先應打印模板目錄下的 blznkpatt.c 文件。這隻是一個黑方塊,中間是空的白色方塊。接著為需要的模板創建一個黑白或者彩色的、適合這個中心的方塊的圖像,並把它打印出來。好的模板應該是不對稱,而且沒有很細微的細節的模板。圖 1展示了一下樣本模板。將做好的新模板粘在黑方塊裏。
圖 1 樣本模板
一旦新的模板製作完畢,改變 bin 目錄,運行 mk_patt 程序(僅在控製台模式下)。係統會提示你輸入一個攝像機的參數文件夾名字。輸入文件夾名:camera_para.dat。這是默認的攝像機的參數文件。
這段程序接著會打開一個視頻窗口,如圖 2 所示:
圖 2 mk_patt 視頻窗口
把要訓練的模板放在一個平的表麵上,光照條件應和運行識別應用程序時的光照條件相同。然後把視頻攝像頭拿起在標識的上麵,向下直對著標識,轉動它直到標識的周圍出現一個紅色和綠色的方框。這指示軟件 mk_patt 已經找到了圍繞在待測試的模板周圍的方框。應該轉動攝像頭直到視頻圖像中的方塊的左上方邊角是高亮的方塊的紅色的邊角,如圖 2 中所示。一旦方塊被找到且方位正確,單擊鼠標左鍵。接著係統會提示你輸入一個模板的文件名字。比如說,輸入 patt.yourpatt。
一旦文件名字被輸入,係統就生成了一個該模板的位圖圖像,位圖圖像被複製到以這個文件名命名的文件中。接下來這個將被用在 ARToolKit 的模板匹配中。為了使用這個新模板,這些數據要被拷貝到文件目錄 bin/Data 下。重新編譯 simpletest 後,現在,你就可以使用你自己的模板了!
訓練了一個模板後,其他的模板也可以被訓練,隻需要用攝像頭對著新模板並重複以上步驟,或者,單擊鼠標右鍵可以退出應用程序。
使用多個模板
現在我們想要使用不止一個的模板,而不同的模板有各自不同的三維物體相對應。為達到此目的,我們將逐步分析目錄 examples/simplem/下的 simplem 文件的源代碼。你會發現兩個源文件,simplemTest.c 和 object.c。這個程序可以探測多個標識卡,並且在每個標識上麵顯示不同形狀的物體(錐體,立方體,球體)。
它和 simple 程序的主要區別是:
● 加載的文件中有多個模板的聲明。
● 與模板相關聯的結構不同,這意味著程序中檢查代碼以及轉換調用不同。
● 語法重新定義,定義畫圖函數。
其他的代碼則都是一樣的!
係統建議使用一個特定的函數——object.c中的read_ObjData 來加載 ARToolKit中的多個模板。利用此函數,可以用如下方法來加載標識:
參量 object 是一個指向一個 ObjectData_T 的結構體的指針。參量 model_name 定義的不是一個模板定義文件名(在這裏文件名是 model_name),而是一個特定的多個模板定義的文件名(警告:這個格式和多個模板跟蹤文件名不同!!!)。文本文件 object_data 指定了哪些標識物體應被識別以及模板怎麼樣與各個物體相關聯。文件 object_data 的開始處記錄了要被指定的物體的數量,接著是每個物體的文本類型的數據結構。object_data 文件中每個標識都被以下結構體詳細說明:
· 名字
· 模板識別文件名
· 跟蹤模板的寬度
· 跟蹤模板的中心
比如說,對應著與虛擬的立方體相關的標識的結構體如下:
#pattern 1
cone
Data/patt.hiro
80.0
0.0 0.0
請注意,以#character 開始是代碼是命令行,被文件讀取器忽略。
ARToolKit 可以試著在 arDetectMarker 流程中識別多個模板了。因為我們現在是探測多個模板,我們需要保持每一個虛擬物體的可見性,同時修改對於以及探測到的模板的檢查步驟。更進一步,我們還需要維持每個已探測模板的特定的轉移。
因此,如果標識被探測到,每一個標識都有一個視覺標誌和一個新的轉移矩陣。現在通過結構體 ObjectData_T 調用繪圖函數來繪製虛擬物體。結構體 ObjectData_T 需要被賦予虛擬物體的參數以及虛擬物體的個數。
繪圖函數同樣很容易理解:遍曆物體的列表,如果物體可見,利用它的姿態按照相應的形狀繪製物體。
現在可以編譯 simplem,確保所有必須的文件已經被放在 data 文件目錄下。結果如圖3 所示。
圖 3 simplem 視頻窗口
你可以修改文件 object_data,使用你自己的模板實驗了!
76.4M / 03-25
立即下載55M / 06-05
立即下載237.9M / 04-13
立即下載140.5M / 03-06
立即下載900.9M / 03-02
立即下載96.2M / 07-06
立即下載311.2M / 07-06
立即下載335M / 07-06
立即下載200M / 07-06
立即下載413.8M / 07-06
立即下載353.9M / 06-05
立即下載131.8M / 04-13
立即下載230.8M / 03-03
立即下載195.6M / 03-03
立即下載165.4M / 03-03
立即下載45.6M / 09-08
立即下載665.2M / 07-06
立即下載2.84G / 07-06
立即下載93M / 07-06
立即下載338.3M / 07-06
立即下載1.38G / 07-26
立即下載488.3M / 07-16
立即下載109.8M / 06-03
立即下載142M / 01-08
立即下載1.2M / 11-23
立即下載548.8M / 04-13
立即下載1.6M / 04-13
立即下載1.48G / 03-18
立即下載646.6M / 03-03
立即下載133.7M / 03-03
立即下載325.8M / 06-07
立即下載60M / 04-29
立即下載254M / 04-25
立即下載659M / 04-23
立即下載1M / 12-26
立即下載253.4M / 12-08
立即下載253M / 12-08
立即下載1.19G / 11-16
立即下載110.5M / 04-23
立即下載26.7M / 03-16
立即下載488.3M / 07-16
立即下載248.9M / 12-08
立即下載248.9M / 12-08
立即下載201.2M / 04-13
立即下載100.6M / 03-06
立即下載148.9M / 03-06
立即下載1.12G / 07-06
立即下載1.25G / 07-06
立即下載9.48G / 07-06
立即下載50KB / 07-06
立即下載116.2M / 04-10
立即下載1.92G / 04-17
立即下載201.5M / 04-13
立即下載7.31G / 07-01
立即下載94.3M / 07-06
立即下載2.48G / 07-06
立即下載7.63G / 07-06
立即下載1M / 07-06
立即下載778.1M / 07-06
立即下載509.7M / 07-06
立即下載561.8M / 07-11
立即下載1.32G / 01-19
立即下載72M / 07-06
立即下載548.7M / 07-06
立即下載1.00G / 07-06
立即下載9.13G / 07-06
立即下載126.2M / 07-06
立即下載72M / 07-06
立即下載105.1M / 07-06
立即下載132M / 07-06
立即下載