MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensでQRコードのテキスト情報を取得する

本日は HoloLens の小ネタ枠です。
HoloLensでQRコードのテキスト情報を取得する手順を試してみます。

MRTKのインポート

HoloLens2 向けのシーン作成のため、MRTK の Foundation パッケージを利用します。
MRTK のインポート手順は以下の記事を参考にしてください。
bluebirdofoz.hatenablog.com
f:id:bluebirdofoz:20201113233157j:plain

Microsoft.MixedReality.QRの取得

QRコードの情報取得に Microsoft.MixedReality.QR を利用します。
取得には NuGet を利用します。以下の記事を参考に NuGetForUnity をインポートします。
bluebirdofoz.hatenablog.com

[Manage NuGet Packages]を開き、[Microsoft.MixedReality.QR]をインポートします。
f:id:bluebirdofoz:20201113233147j:plain

QRコードのテキスト情報を取得する

QRCodeWatcher クラスからQRコードの検出や検出したQRコードの情報を取得することができます。
docs.microsoft.com

検出したQRコードのテキスト情報をテキストメッセージに出力する以下のスクリプトを作成しました。
・QRReadTest.cs

using UnityEngine;
using UnityEngine.UI;

using Microsoft.MixedReality.QR;

[RequireComponent(typeof(Text))]
public class QRReadTest : MonoBehaviour
{
    // 文字列を出力するテキストUI
    private Text UIText;

    // QRCodeWatcher
    private QRCodeWatcher qRCodeWatcher;

    // 最新の検出文字列
    private string CurrentQRText;
    
    async void Start()
    {
        // テキストUIの参照取得
        UIText = this.GetComponent<Text>();

        // QRCodeWatcherの許可リクエスト
        await QRCodeWatcher.RequestAccessAsync();

        // インスタンスの生成とイベント登録
        qRCodeWatcher = new QRCodeWatcher();
        // 新規QRコード追加時イベント
        qRCodeWatcher.Added += QRCodeWatcherAdded;
        // QRコード更新時イベント
        qRCodeWatcher.Updated += QRCodeWatcherUpdated;
        // QRコード削除時イベント
        qRCodeWatcher.Removed += QRCodeWatcherRemoved;
        
        // QRコード検出の開始
        qRCodeWatcher.Start();
    }

    private void Update()
    {
        // 最新のQRコードのテキスト情報を表示する
        UIText.text = CurrentQRText;
    }

    /// <summary>
    /// 新規QRコード追加時イベント
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void QRCodeWatcherAdded(object sender, QRCodeAddedEventArgs e)
    {
        // 検出したQRコード情報を取得する
        QRCode codeInfo = e.Code;
        // テキスト情報を保存する
        CurrentQRText = codeInfo.Data;
    }

    /// <summary>
    /// QRコード更新時イベント
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void QRCodeWatcherUpdated(object sender, QRCodeUpdatedEventArgs e)
    {
        // 検出したQRコード情報を取得する
        QRCode codeInfo = e.Code;
        // テキスト情報を保存する
        CurrentQRText = codeInfo.Data;
    }

    /// <summary>
    /// QRコード削除時イベント
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void QRCodeWatcherRemoved(object sender, QRCodeRemovedEventArgs e)
    {
        // 検出したQRコード情報を取得する
        QRCode codeInfo = e.Code;
        // テキスト情報を削除する
        CurrentQRText = "";
    }
}

検出したテキスト情報を表示するための Text オブジェクトを作成し、そこにスクリプトをアタッチします。
f:id:bluebirdofoz:20201113233235j:plain

カメラの権限設定

QRコード認識のため、カメラの利用権限を設定しておく必要があります。
メニューから[Edit -> Project Settings..]を開き、[Player -> Publishing Settings]パネルを開きます。
[Capabillities]の[WebCam]にチェックを入れます。
f:id:bluebirdofoz:20201113233244j:plain

動作を確認する

今回は以下のページで任意のテキスト情報を持つQRコードを作成しました。
crocro.com
f:id:bluebirdofoz:20201113233308j:plain

QRコードを見ると、テキストUIにQRコードのテキスト情報が表示されれば成功です。
f:id:bluebirdofoz:20201113233318j:plain
カメラの権限を有効化した状態で起動する必要があります。
起動時のダイアログでカメラ権限を有効にする場合、初回起動時はQRコードを検出できないので注意が必要です。