Android の Camera2 API と Mobile Vision API を使って バーコードを検出する


Camera2 API と Mobile Vision API を使って 顔検出する
の続きです。

概要

前回の記事では、カメラからの連続画像から顔を検出した。
今回の記事では、カメラからの連続画像からバーコードを検出する。

下記の公式サンプルコードでは、カメラの制御に 旧来の Cameara API を使っている。

googlesamples barcode-reader

Cameara API

この記事では、Camera2 API を使って 同様の機能を持つ アプリを作成する。

前回の記事で作成した顔検出のアプリをベースにする。

Mobile Vision API を使ったバーコード検出 に関して下記の記事を参考にした。

Mobile Vision API の設定

AndroidManifest.xml を変更する

AndroidManifest.xml

    <!-- 顔検出のとき -->
        <meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="face" />

    <!-- バーコード検出のとき -->
        <meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="barcode" />

バーコードを検出する

顔検出のときと同様の処理を行う。

BarcodeDetector

BarcodeDetector を生成する

  MultiProcessor<Barcode> processor

  BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this).build();

  barcodeDetector.setProcessor( processor );

FrameProcessor

カメラからの連続画像を受け取り BarcodeDetector に渡すための FrameProcessor クラスを作成する。

このクラスは、顔検出のものをそのまま流用する。

BarcodeTracker

BarcodeDetector から顔検出の結果を受け取るための BarcodeTracker クラスを Tracker を継承して作成する

reference: Tracker

検出したバーコードの上に長方形を表示する

顔検出のときと同様の処理を行う。

ViewGroup を継承した CameraSourcePreview を作成する。
CameraSourcePreview の子のビューとして、カメラのプレビュー画面を表示する TextureView と長方形を表示するオーバーレイ用の View を作成する。

複数のバーコードから1つを選ぶ

画面をタッチして選択する。

タッチした画面の位置とバーコードの長方形の位置から、近くにあるものを選択する。

    Barcode best = null;
    float bestDistance = Float.MAX_VALUE;
     for (BarcodeGraphic graphic : graphicOverlay.getGraphics()) {
            Barcode barcode = graphic.getBarcode();
            if (barcode.getBoundingBox().contains((int) x, (int) y)) {
                best = barcode;
                break;
            }
            float dx = x - barcode.getBoundingBox().centerX();
            float dy = y - barcode.getBoundingBox().centerY();
            float distance = (dx * dx) + (dy * dy);  
            if (distance < bestDistance) {
                best = barcode;
                bestDistance = distance;
            }
    }

バーコードのサンプル

下記のサイトで作成した

9種類のうち日本の郵便番号バーコードは検出できなかった。

バーコードどころ

郵便番号・バーコードマニュアル

スクリーンショット

サンプルコードを GitHub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Vision3