8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-02

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種類のうち日本の郵便番号バーコードは検出できなかった。

バーコードどころ

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

スクリーンショット

vision3.png

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

8
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?