一覧に戻る

Unity3Dプラグインの画像認識

2017.06.14Unity3Dプラグイン

Unity3Dプラグインの画像認識

この例では、ファインダ内の画像を認識し、画像にオーバーレイする方法を示します。

画像認識

より理解を深めるために、ビジョンベースの拡張現実に関するこのドキュメントの以下のセクション、および他のセクションで使用されるいくつかの用語を説明します。

  • ターゲット:2Dターゲット画像とそれに関連する抽出されたデータ。トラッカーが画像を認識するために使用します。
  • ターゲットコレクション:トラッカーが認識できる2Dターゲットのコレクションを格納するアーカイブ。 ターゲットコレクションには、最大1000個のターゲットを保持できます。 ターゲットコレクションは.wtcファイルとして保存されます
  • ImageTracker:トラッカーは、ライブカメラ画像を分析し、関連付けられたターゲットコレクションに格納された2Dターゲットを検出します。複数のトラッカーを作成できますが、同時に使用できるトラッカーは 1つだけです。

Unityでの簡単な画像認識

wikitude unityプラグインは、事前設定されたプレハブに基づいています。使用可能なプレハブには2種類あります。一つはWikitudeCameraプレハブで、もう一つはImageTrackerプレハブです。

WikitudeCamera Prefab

WikitudeCameraプレハブは、すべての機能拡張の後ろにライブカメラストリームをフルスクリーンで表示します。 このプレハブには、あらかじめ入力されていない1つのパラメータを持つスクリプトコンポーネントが添付されています。 このパラメータはWikitude SDKライセンスキー用であり、独自のライセンスキーで埋めなければなりません。商用ライセンスを購入するか、無償トライアルライセンスキーをダウンロードして、Unityと組み合わせてネイティブSDKで試してもかまいません。
 

ImageTracker Prefab

シーンにトラッカープレハブを追加するには、ImageTrackerプレハブをシーン階層にドラッグします。

Trackableプレハブで使用されるtargetNameが、ターゲットコレクション内のターゲット名の1つに対応していることを確認してください。 ワイルドカードを使用して、任意のターゲットに一致させることも、ターゲットの特定のサブセットのみに一致させることもできます。

ImageTracker自体には、参照画像を検出するために必要な情報を含むWikitude Target Collection(.wtcファイル)が必要です。ターゲットコレクションはWikitude Target Manager(無料のWebベースツール)から生成してダウンロードすることができ、開発者アカウントでアクセスできます。また、WTCエディタを使用してUnity内でwtcファイルを生成することもできます。.wtcファイルをStreamingAssetsフォルダに配置して、Wikitude Native SDKが実行時に読み込むことができるようにします。使用する.wtcファイルを指定するには、シーン内のImageTrackerゲームオブジェクトを選択します。 Target SourceがTarget Collection Resourceに設定されていることを確認し、Target Collectionの横にあるドロップダウンを使用して目的のものを選択します。

.wtcファイルを正常に読み込むなどのイベントに反応するには、ImageTrackerのインスペクタにリストされているUnityイベントを使用できます。これらのイベントは2つのグループに分かれています。最初のグループには、エラーがあった場合にwtcファイルがロードされたときにTargetCollectionResourceによってトリガーされたイベントが含まれています。 2番目のグループは、ImageTracker自体が目的の.wtcファイルで正常に初期化されたかどうかによってトリガーされるイベントです。目的のイベントで、プラス記号をクリックして新規加入者を追加し、None(Object)フィールドにイベントを受け取るGameObjectをドラッグし、No Functionドロップダウンから呼び出す関数を選択します。

基本的なパラメータタイプが1つのイベントに登録する場合は、下部の静的バージョンではなく、動的にマークされた最上位リストから機能を選択してください。これにより、パラメータがWikitudeプラグインから正しく渡され、Unityによって上書きされなくなります。

コールバックの設定

Unityイベントの操作の詳細については、Unityマニュアルとイベントチュートリアルを参照してください。

カスタムオーグメンテーションの定義

また、ImageTrackerプレハブの一部はImageTrackableオブジェクトです。 トラッキング可能なものは、トラッキングする対象のコレクションの対象を定義します。 トラッカーがStreamingAssetsフォルダにあるwtcファイルを使用している場合、ImageTrackableインスペクタはwtcファイル内のすべてのターゲットのリストを表示します。 アクティブなボタンを切り替えることで、このトラッキング対象でトラッキングするターゲットを選択するか、上部にある[すべて選択]を選択してすべてのターゲットを含めることができます。 同様に、拡張トラッキングを使用するターゲットを選択することもできます。

プレビューボタンを押すと、シーンの3Dビューにターゲットが表示され、ターゲットに対して拡大表示する便利な方法が提供されます。

 

たとえば、実行時にダウンロードする場合やCloudRecognitionServiceを使用する場合など、wtcファイルが別の場所にある場合でも、ターゲット名をTargetPatternテキストフィールドに入力することで、どのターゲットを含めるかを選択できます。可能な値は、完全なターゲットイメージ名(pageOne、pageTwoなど)またはワイルドカード(page *)です。すべてのターゲットを含める場合は*を使用できます。

参照画像がカメラストリームで見つかった場所に3Dオブジェクトを配置するには、任意のGameObjectを子としてImageTrackableオブジェクトに追加します。ランタイム中は、カメラの変換のみが変更されるため、ImageTrackable GameObjectとその子供を配置して拡大縮小することができますが、最も便利です。ランタイム中にImageTrackable GameObjectを動かすと、カメラがそれに追従するため、効果的な変更は見られません。たとえば、ユーザーの入力に基づいて増強をドラッグする場合など、増強をカメラに対して移動する必要がある場合は、トラッキング可能なGameObjectを移動しないように注意してください。

「トグル自動表示の切り替え(Auto Toggle Visibility)」トグルは、デフォルトで有効になっています。 これをチェックすると、ImageTrackable GameObjectが視界外になると自動的に無効になり、対象が再びトラッキングされたときに有効になります。

可視性を手動で処理するには、このトグルをオフにして、トラッキング可能オブジェクトのOnImageRecognizedイベントとOnImageLostイベントを登録します。 これは、どのターゲットがトラッキングされたかに基づいて異なる増強を表示する場合に役立ちます。 これらのイベントの文字列パラメータは、どのターゲットがトラッキングされたか、または失われたかを示します。

OnImageRecognizedイベントとOnImageLostイベントは、「トグル自動表示の切り替え(Auto Toggle Visibility)」トグルがオンになっていても呼び出されます。 たとえば、OnExitFieldOfVisionを処理してターゲットが失われたときに、クライアント認識 - 拡張トラッキングがUIを更新します。

複数のターゲット

画像トラッカーは、同時に複数のターゲットをトラッキングすることができます。これは、ImageTrackerインスペクタで、認識するターゲット数を1より大きい値に設定します。ただし、複数のターゲットを使用しない場合は、最適なパフォーマンスを得るために値に1を設定することを推奨します。

複数のターゲットを定義するには、ImageTrackableインスペクタのプレビューをDrawableフィールドに設定する必要があります。実行時に新しいターゲットが認識されると、Drawableプレハブがインスタンス化され、Trackableの子としてシーンに配置され、ターゲットが失われたときに破棄されます。複数のターゲットがトラッキングされているとき、それらに対応するDrawableはカメラに表示するものと一致するようにゲーム世界に配置されます。これはまた、ゲームの世界でターゲット間の相対的な位置を直接推測できることを意味します。

この動作は、シンプルなユースケースのために簡単にセットアップできるように設計されていますが、有効期間をより詳細に制御する必要がある場合があります。その場合は、ImageTrackableインスペクタのDrawableフィールドを空のままにして、OnImageRecognizedイベントとOnImageLostイベントにコールバックを追加することができます。OnImageRecognizedが呼び出されると、パラメータとして渡されるImageTargetにはDrawable GameObjectプロパティが含まれます。この空のGameObjectは上で説明したDrawableと同じように振る舞うので、それらが正しく配置されていることを確認するために拡張の親として使うべきです。

public void OnImageRecognized(ImageTarget recognizedTarget) {
    // Create the custom augmentation.
    // You can use recognizedTarget.Name and recognizedTarget.ID
    // if you need custom augmentations for each target and instance.
    GameObject newAugmentation = GameObject.CreatePrimitive(PrimitiveType.Sphere);

    // Set the newAugmentation to be a child of the Drawable.
    newAugmentation.transform.parent = recognizedTarget.Drawable.transform;

    // Position the augmentation relative to the Drawable by using the localPosition.
    newAugmentation.transform.localPosition = Vector3.zero;
},

Drawableはターゲットを紛失すると破棄されるので、そのDrawableに付随する拡張がある場合には、それらも破棄されることに注意してください。OnImageLostイベントはDrawableが破棄される前に呼び出されるため、ターゲットが失われた後も持続させる必要がある場合は、そのイベントを使用して拡張を別の場所に移動できます。

同じターゲットが複数回同時に検出された場合は、ImageTargetパラメータのIDプロパティを使用して区別できます。

拡張トラッキング

拡張トラッキングは、ターゲットごとに個別に設定できるオプションのモードです。 このモードでは、元のターゲットイメージがもう表示されなくても、Wikitude SDKは環境をスキャンし続けます。 したがって、トラッキングは元のターゲット画像の限界を超えて拡張されます。 この機能のパフォーマンスは、デバイスのコンピューティングパワー、背景テクスチャ、およびオブジェクトなどのさまざまな要因によって異なります。

ターゲットを含む.wtcファイルがStreamingAssetsフォルダにある場合は、Image Trackableのインスペクタですべてのターゲットをリスト表示できます。拡張トラッキングを有効にするには、拡張する各ターゲットの横にある拡張トラッキングオプションを選択するか、リストの一番上にあるすべての拡張を選択してすべてのターゲットを拡張します。.wtcファイルが実行時にカスタムの場所から読み込まれる場合、Image Trackableはより簡単なインターフェイスを備えているので、拡張トラッキングを手動で有効にして、拡張したいターゲットの名前を指定することができます。リスト内のファーストネームをワイルドカード*に設定して、コレクション内のすべてのターゲットを拡張することができます。

拡張トラッキングが有効になっている場合、ImageTrackerはOnExtendedTrackingQualityChangedEventsを発生させ、上記の要因に基づいて拡張トラッキングがどれくらいうまく機能しているかを知ることができます。

ランタイムトラッカー

実行時にイメージトラッカーを作成することができ、使用するターゲットコレクションの場所に制限はありません。 これを行うには、単純に新しいGameObjectを作成し、それにImageTrackerコンポーネントを追加し、TargetCollectionResourceをTargetSourceTypeとして選択し、新しいTargetCollectionResourceオブジェクトを作成します。 StreamingAssetsフォルダにあるコレクションを使用している場合、TargetPathプロパティはStreamingAssetsフォルダに対する相対パスであり、UseCustomUrlプロパティはfalseにする必要があります。

デバイスまたはWeb上の別の場所にあるコレクションを使用する場合、TargetPathプロパティには、ターゲットへの絶対パス(必要に応じて、プレフィックスとしてプロトコルを示す、file://、http://、またはhttps://をつけた絶対パス)を設定する必要があります。 この場合のUseCustomUrlはtrueに設定する必要があります。 これを設定する方法の例として、サンプルのクライアントトラッカー - ランタイムトラッカーを参照してください。

また、実行時にTrackableを作成することもできますが、親トラッカーでStart()メソッドが呼び出される前にトラッカーの子として追加することを忘れないでください。追加されてなければ、時間内に登録されません。

GameObject trackerObject = new GameObject("ImageTracker");
ImageTracker imageTracker = trackerObject.AddComponent<ImageTracker>();

imageTracker.TargetSourceType = TargetSourceType.TargetCollectionResource;
imageTracker.TargetCollectionResource = new TargetCollectionResource();
imageTracker.TargetCollectionResource.UseCustomURL = true;
imageTracker.TargetCollectionResource.TargetPath = "https://url.to.your.collection/collection.wtc";

GameObject trackableObject = GameObject.Instantiate(TrackablePrefab);
trackableObject.transform.SetParent(imageTracker.transform, false);

実行時にトラッカーを作成するには、TargetCollectionResourceの代わりにCloudRecognitionServiceを使用することもできます。

複数のトラッカー

同じシーンに複数のトラッカーを配置できますが、一度に1つのトラッカーしかアクティブにすることはできません。 2番目のプラグインを有効にすると、最初のプラグインはプラグインによって自動的に無効になります。