Vuforia Engineをいじめてみた ~Image Target編~

## まえがき

**Vuforia Engine**の**Image Targets**という機能を遊び尽くしてみました。

Image Targetsは、2次元の画像をマーカーとしてAR表現ができる機能です。

今回はImage Targetsの機能を使い倒してみました！

## 実行環境

- Unity 2019.3.0f3
- Vuforia Engine 9.0
- iPhone 11 Pro

## Vuforia Engineとは

Vuforia Engineは、iOSやAndroid、PC、HoloLensといったAR/MRデバイスに対応したAR開発プラットフォームです。

Vuforia EngineはPTCが提供していますが、元々はQualcommが開発しており、2015年にPTCがVuforia事業を6500万ドルで買収しています。

マーカートラッキングを非常に得意としており、特徴点の多い(複雑な)画像であればほとんどぶれることなく3Dオブジェクトを配置することができます。

詳しくはこちらをご覧ください！

<a href="https://qiita.com/kot10n5tn/items/b0cc615206e806dd2904">今一番ホットなARライブラリ「Vuforia」とは</a>

画像をターゲットにする**Image Targets**を使っていきたいと思います。

ライセンスの取得とライセンスキーをUnityに設定する方法関しては、<a href="https://qiita.com/kot10n5tn/items/757c093e9e556453caec">ラズパイ4をVuforia Engineで分身させてみた ~Object Recognition編~</a>こちらをご覧ください。

## マーカーを20個用意して検証してみた

Vuforia EngineのImage Targetsでは、マーカーは最大でも**10個まで**を推奨しています。

推奨ということは、11個以上でも動くの？

と思ったので、マーカーを20個用意して検証してみました。

ターゲットにはこちらの画像を使用させていただきました。

https://placeimg.com/

### データベースの作成　

https://developer.vuforia.com/

Vuforiaディベロッパーポータルからデータベースを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/326ab23e-336d-5033-75dc-b4960b2e1c89.png)

Deviceを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/dfa6dca4-6ff8-7875-17aa-f391fbc05e0a.png)

Add Targetから**Single Image**でターゲットを追加していきます。

Widthは実際に印刷するターゲットのサイズを**メートル単位**で入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/881356df-aa45-6ae2-478c-4133ac91447e.png)

20枚登録したあと、データベースをUnity向けにダウンロードして展開することで、データベースの登録が完了します。

### UnityでImage Targetの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/a82fb76f-eabc-7161-beab-967420dffe69.png)

Image TargetにSphereを配置していきました。

### 実際に認識してみた

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ターゲット6つでトラッキング <a href="https://t.co/htPgiLeM1w">pic.twitter.com/htPgiLeM1w</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1267071122660454401?ref_src=twsrc%5Etfw">May 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ターゲット20個でトラッキング <a href="https://t.co/qg2vUaaBmO">pic.twitter.com/qg2vUaaBmO</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1267071406035972099?ref_src=twsrc%5Etfw">May 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ターゲットを6個とした場合と比べると、20個の場合は初回の認識に少し時間がかかることがわかりました。

しかし、初回の認識以降は特に違いはなさそうでした。

## Cloud Recognitionの挙動を確認してみた

### Cloud Recognitionの概要

Image Targetsは、デバイスにマーカーの画像情報を保持するか、クラウドからフェッチするかの2種類があります。

デバイスにマーカーの情報を保存する場合は、プランに関わらず**100個**まで登録することができます。

クラウドからフェッチする**Cloud Recognition**は、ライセンスによってクラウドに登録できるマーカーの数が変わります。

||Development  |Basic + Cloud  |Pro  |
|---|---|---|---|
|**マーカー上限**|1,000個  |100,000個  |100,000個以上  |
|**認識回数上限**|1,000 recos/month  |10,000 recos/month  |10,000 recos/month以上 |

Developmentプランは無料で使うことができるので、最低でも1000個までは登録することができます。

### 実際にCloud Recognitionを使用してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/c00bbd47-baa6-b528-6969-da344466de3d.png)

クラウド向けにデータベースを作成します。

<img width="664" alt="cloud.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/3f04ec5d-707c-8140-4813-e0abb19be3c2.png">

`Access Key`と`Secret Key`をコピーし、Unityの**Cloud Recognition**のCloud Reco Behaviourコンポーネントにペーストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/d1176a2f-215f-51fd-4f3c-56332b757eb4.png)

そして、**Cloud Recognition**にGithubにある、**Simple Cloud Reco Evnet Handler**をアタッチします。

`Image Target Template`に**Image Target**を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264666/e7d58a98-52b3-6ad9-2c04-829dd1b88d5c.png)

すると、このような挙動になりました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">Cloud Recognition <a href="https://t.co/gWwnIwCK2q">pic.twitter.com/gWwnIwCK2q</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1267071733099462656?ref_src=twsrc%5Etfw">May 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

初回の読み込みに1秒程度時間はかかるものの、それ以降はDeviceのImage Targets同様に動作します。

## Extended Trackingの挙動を確認してみた

Extended Trackingとは、ターゲットがカメラから外れてもトラッキングを続ける機能です。

ターゲットが固定されている場合に有効です。

ターゲットが1個の場合の動画は見かけたことがあるので、3個置いて実験してみました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">Extended Tracking <a href="https://t.co/hgyVZR0p2G">pic.twitter.com/hgyVZR0p2G</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1267072258595450888?ref_src=twsrc%5Etfw">May 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ターゲットが画面から外れた後に、ターゲットのマーカーを隠してみました。

ですが、最初に認識した場所にオブジェクトが止まってることがわかるかと思います。

街中での看板だったり、動かないものにたいして非常に有効的だと感じました。

## サイズは正確？Ground Planeも使ってみた

Ground Planeという機能は、水平面を検知してオブジェクトを置くことができます。

そこで、Ground PlaneとImage Targetsを用いて同じサイズのオブジェクトを表示した場合、どれくらいの誤差が生まれるのか検証してみました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">Ground Planeとのサイズ比較 <a href="https://t.co/jbmdlH8zcS">pic.twitter.com/jbmdlH8zcS</a></p>&mdash; こーや (@koyataroo) <a href="https://twitter.com/koyataroo/status/1267072835861704704?ref_src=twsrc%5Etfw">May 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どちらも5cmの立方体を置いているのですが、視覚的には違いがわかりません。

**Ground Plane**も**Image Targets**もサイズの誤差がほとんどなく配置することが可能ということがわかりました。

## まとめ

**Vuforia Engine**の**Image Targets**は、かなり精度良くトラッキングすることができました。

Image Targetは、**IoT**の場面で非常に有効になると考えています。

デバイスにマーカーを貼ることで、かざすだけでデバイスの情報を表示することができます。

IoTでは、センサーやデバイスは何百何千のオーダーで使うことが多々あります。

その場合、動的にターゲットの追加/削除をすることのできる**Cloud Recognition**がおすすめです。

有料プランにはなりますが、100万個を超えるターゲットを利用することができ、それらをリアルタイムに更新することができます。(**1000個までは無料です**)

IoT以外の分野でも、出版や小売、広告、製品の認識など幅広く使われるのではないかと考えています。

**Cloud Recognition**を使用することで、有料プランにはなりますが100万個以上のターゲットを動的に追加したり削除したりすることができます。



開発者向けのVuforia Slackコミュニティがあり、僕も参加しています。
記事の内容で質問があればそちらから質問下さい！

また今回のコードはGithubに載せているので是非クローンしてお手元で試してみてください！

https://github.com/kot10n5tn/ImageTarget