ImageTarget
前言
ImageTarget 顧名思義,就是圖像識別,本文記錄下作者最近學習vuforia中的imageTarget筆記與心得。
vuforia guide:https://library.vuforia.com/articles/Training/Image-Target-Guide
vuforia sample - 選擇 Core Features下載,導入ImageTarget.unitypackage:https://developer.vuforia.com/downloads/samples
vuforia 基礎知識:高通Vuforia Getting Started
開發環境
Vuforia 6.0.112
Unity 5.3.6f1 x64 (Android平台)
Windows 7 x64
名詞說明
下面列舉下本文中所列出的幾個名詞,可能每個人對這些英文的理解不一樣,這些解釋僅僅代表個人觀點。
Database(數據集、圖集):大體都是指多張圖片組合在一起的那個東西
ImageTarget(識別圖):具體的某張識別圖像
自帶Demo簡單分析
1、從Demo中可以看出,當有多個ImageTarget時,每個ImageTarget之間是有間距的,可以簡單理解為每個ImageTarget的坐標值不一樣【(x,z)平面】,如下所示:
2、Demo中把需要識別的圖,全部以ImageTarget的形式,放置在場景中
3、Word Center Mode默認的模式選擇的是 FirstTarget
4、如果需要同時識別多個ImageTarget,需要設置最大識別數量
World Center Mode
FirstTarget
相機在運動,第一個Found的ImageTarget坐標不動,其它ImageTarget會輕微地運動
Camera
ImageTarget在運動,相機不動
自己搭建的簡單步驟
1、上傳識別圖到管理后台(單張圖像不超過2mb大小,如果是灰度圖,建議使用jpg格式),管理后台會智能地標注出圖像的識別點(如何讓圖像更具可識別性?有針對圖像的設計指南)
2、下載識別圖package,導入到Unity中,package中包括數據集(xxx.data),xml(xxx.xml),識別圖(xxx_scale.jpg,xxx_scale.png)
3、根據Demo的示例創建一個新場景,里面有ARCamera,ImageTarget,在ImageTarget的屬性面板選擇database和識別圖(ImageTarget)
4、運行程序,當攝像頭識別到步驟3的選定的識別圖之后,就會觸發OnFound事件,而當識別圖移開或者被遮擋,會觸發OnLost事件
具體的業務邏輯,在OnFound和OnLost中進行處理
void OnFound(string trackableName){ //TODO 識別成功的邏輯處理,參數trackableName就是xml中的name } void OnLost(string trackableName){ //TODO 丟失的邏輯處理,參數trackableName就是xml中的name }
xml 分析
下載的package中的xml內容如下
<?xml version="1.0" encoding="UTF-8"?> <QCARConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="qcar_config.xsd"> <Tracking> <ImageTarget name="798_01" size="1.000000 1.434034" /> <ImageTarget name="799_01" size="1.000000 1.434034" /> </Tracking> </QCARConfig>
分析:這里面的內容就是我們上傳的識別圖的圖片名,長寬的比例。
默認這份xml是放在 StreamAssets\database\database.xml,當然如果不需要那么多的識別圖,而又不想在管理中刪除多余的識別圖,那么有個簡單的方法,刪除xml中的幾行數據,就會刪除相應的識別圖了。
查看圖像識別點
登錄vuforia的管理后台 https://developer.vuforia.com/targetmanager/singleDeviceTarget/deviceSingleImageTargetDetails
選擇TargetManager - 選擇具體的 Database - 具體的 Image - Show Feature 可以看到識別圖的識圖點
Tips
同一張識別圖,彩圖和灰白圖的識別點是一樣的,如下所示我上傳的是張彩色的圖,但Show Features顯示的是張灰白圖。
識別任意張圖代碼實現
需求說明
假設共有20張圖像,當用戶掃描其中任意一張圖,都可以成功被識別,再比如圖集中有500張圖像,當掃描任意張圖像時都可以被成功識別
思路分析
通過上面的操作步驟,我們知道只有在場景中存在的ImageTarget,在攝像頭掃描到時,才可以觸發識別成功事件。
那么我們需要做的就是:把database中的識別圖全部實例成ImageTarget,可能你會想,那就把ImageTarget的prefab實例化20或500個,每個實例的ImageTarget不同唄。
思想是這樣的,但還有更簡捷的方法。
Load Database
在ARCamera的Database Load Behaviour中勾選了需要的 database之后,運行就會把database中所有的imagetarget都生成出來,並自動已選擇好了不同的ImageTarget
測試代碼
通過上面的實踐,我們知道既然Vuforia會自動把所有的ImageTarget都生成出來,那么我們就可以更加方便了
下面這段代碼可以獲取所有的識別對象
IEnumerable<TrackableBehaviour> trackableBehaviours = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();
Tips
1、經測試多圖識別中,在丟失之后最好重設下ImageTarget的位置到初始值,否則可能出現奇怪現象。
2、可以獲取ImagetTargetBehaviour的Size,設置每個ImageTarget的位置
測試代碼:https://github.com/zhaoqingqing/blog_samplecode/tree/master/ar-vr-mr/vuforia/imagetarget