よこやま日記・技術/ガジェット編

@hiroyky IT系エンジニアのまったりブログ

HololensでQRコードリーダを作ってみた.

作ったもの

AirTapするとQRコードを読み込んで,その内容を空間に表示するHololensアプリケーションです.


Hololens Qr code reader

仕組み

QRコードの検出とデコードにZXing.Netを利用しました.

AirTapするとHololensのカメラの画像をZXingに入力して,デコードを行います. デコードで得られたQRコードの内容のカーソルの座標に表示します. カーソルの座標を3次元で得るためにSpatialMappingはあらかじめ行っています.

(まぁ,できあいの物をつなげただけと言われればそれまでです.)

ソースコード

今回開発したものはこちらで公開しています.

github.com

ポイント

WebCamとSpatialMappingを許可

HolotoolKit-Unityをインポート後,WebCamとSpatialMappingを許可します. f:id:hiroyky:20170223003953p:plain

HololensのWebCamは2017年2月23日現在,UnityEditor上でのデバッグには非対応のようです. 実際,UnityEditor上でWebCamを使用すると開発PCに接続しているWebCamの映像が入力されました. (これはこれでデバッグとして使えるかもしれませんが.)

インポートするZXingについて

HololensはUWPアプリケーションであるため,ZXingに含まれるzxing.winmdをプラグインとしてインポートします. インポート後,WSAPlayerでのみ使用するように設定されていることを確認します. f:id:hiroyky:20170223003403p:plainf:id:hiroyky:20170223003433p:plain

UnityEditorは非対応のため,プリプロセッサで分岐します.

    public string Decode(byte[] src, int width, int height) {
#if !UNITY_EDITOR
        Debug.Log("qr decoding...");
        ZXing.IBarcodeReader reader = new ZXing.BarcodeReader();
        var res = reader.Decode(src, width, height, ZXing.BitmapFormat.BGRA32);
        if (res == null) {
            return null;
        }
        return res.Text;
#else
        return "editor debugging...";
#endif
    }

.Net Framework,.Net Core, UWP, Xamarinなど最近いろいろありますが,この辺りを知っている人は難なくできそうでうですが,自分にとってはつまづきポイントだったため,記述しておきます;;

WebCamで撮影

Hololensで見ている景色を撮影する方法は Locatable camera in Unityで解説されています.

また,CameraParameterのhologramOpacityプロパティの値を0にすることでホログラムが映らなくなるはずなので,今回は0にします.

c.hologramOpacity = 0;

該当コード: HololensQrCodeReader/PhotoInput.cs at master · hiroyky/HololensQrCodeReader · GitHub

QRコードのデコード

QRコードの検出とデコードはもっぱらZXingのライブラリ任せです. byte配列にして渡しています.

該当コード: HololensQrCodeReader/QrDecoder.cs at master · hiroyky/HololensQrCodeReader · GitHub

QRコードの内容表示

QRコードを無事デコードできたら,その内容をTextMeshで表示します。 TextMeshの表示位置はカーソルの位置です。

まとめ

突貫で簡易ながらHololensでQRコードリーダを作ってみました.