fuzzy study

仕事・趣味で勉強したことのメモ

Unityでバーコード・QRコードリーダーをつくる

Unityを使って、バーコードやQRコードをカメラで読み取るアプリを作ろうと思い立ち、やってみました。

Unityバージョンは2018.1.6f1。

こちらの記事を参考に進めたら骨子は難なくできました。

qiita.com

www.urablog.xyz

Zxingというのが、バーコードリーダーライブラリのデファクトのようで、あらゆる言語・プラットフォームに対応したバージョンを提供しています。

GitHub - zxing/zxing: ZXing ("Zebra Crossing") barcode scanning library for Java, Android

UnityはC#なので派生プロジェクトのZxing.Netを使うんですね。
Clientsの中にUnity向けのサンプルコードがありまして、こちらも参考になりました。

参考にした記事・コードを踏まえて自分で作ってみたときのポイントは、

  • StartにてwebcamTextureの初期化とPlay()をするが、これらの処理が完了する前にUpdateが呼ばれることがあるため、Updateの頭でチェックをしてあげる必要があった。
    void Update()
    {
        if (webcamTexture == null || !webcamTexture.isPlaying)
        {
            return;
        }
        ・・・
  • ZxingのBarcodeReaderクラスのDecodeでバーコード認識処理ができるが、重い処理なのでUpdate内で単純に呼ぶとフレームレートが落ちてカクカクになってしまう。 そのため、ZxingのサンプルのDecodeQRメソッドのように、Decodeの処理は別スレッドで回し、結果だけ受け取るようにするとよい。
  • Zxingでは、QRコードでも普通の1次元バーコードでもBarcodeReaderクラスのDecodeメソッドで読み取れる(自動的に判別してくれる)が、1次元バーコードの場合、カメラに対して水平方向に映す必要がある。
  • Android向けにビルドする場合、WebCamTextureはLandscapeの向きでキャプチャされるため、Portraitで使いたい場合はテクスチャを貼っているオブジェクトを90度回転させてつじつまを合わせる、という方法がよく出てくる。
    しかし1次元バーコードを読み取りたい場合、90度回転させると見た目に対してバーコードを縦向きに映す必要があり、直感的でなくなる。
    そのため、LandscapeでUIを作るか、Landscapeで指定した上でPortrait向きに使って違和感のないUIにするか、といった工夫が必要になる。

そのほか、バーコードリーダー部分とは関係ないけど、Unityでカメラを使う方法を学べた。

  • WebCamTextureを使う
  • UI.PanelなりCubeなりにWebCamTextureのインスタンス指定することで表示する
  • 表示処理(Updateメソッド)と画像処理は別スレッドにするのがよい

ぐっちゃぐちゃだけど試した時のコードはこちら(github)