HololensでQRコードリーダを作ってみた.
作ったもの
AirTapするとQRコードを読み込んで,その内容を空間に表示するHololensアプリケーションです.
仕組み
QRコードの検出とデコードにZXing.Netを利用しました.
AirTapするとHololensのカメラの画像をZXingに入力して,デコードを行います. デコードで得られたQRコードの内容のカーソルの座標に表示します. カーソルの座標を3次元で得るためにSpatialMappingはあらかじめ行っています.
(まぁ,できあいの物をつなげただけと言われればそれまでです.)
ソースコード
今回開発したものはこちらで公開しています.
ポイント
WebCamとSpatialMappingを許可
HolotoolKit-Unityをインポート後,WebCamとSpatialMappingを許可します.
HololensのWebCamは2017年2月23日現在,UnityEditor上でのデバッグには非対応のようです. 実際,UnityEditor上でWebCamを使用すると開発PCに接続しているWebCamの映像が入力されました. (これはこれでデバッグとして使えるかもしれませんが.)
インポートするZXingについて
HololensはUWPアプリケーションであるため,ZXingに含まれるzxing.winmdをプラグインとしてインポートします. インポート後,WSAPlayerでのみ使用するように設定されていることを確認します.
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コードリーダを作ってみました.