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


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

概要

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

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

下記の公式サンプルコードを例に説明する。

googlesamples multi-tracker

公式サンプルコードでは、カメラの制御に
Mobile Vision API の CamearaSource を使っている。

reference: CameraSource

この記事では、今までの記事で自作した CamearaSource を使用する。

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, face" />

MultiDetector

マルチ検出器 (MultiDetector) は、複数の検出器(Detector)を組み合わせるために使用する。
ソースから受信した1つまたは複数のフレーム上で複数の検出器を一緒に使用することができる。
各検出器は関連する各フレームで別々に実行される。

reference ; MultiDetector

下記のように、FaceDetectorとBarcodeDetectorを生成したのちに、MultiDetector に合体する。

// FaceDetector
        FaceDetector faceDetector = new FaceDetector.Builder(context).build();
        FaceTrackerFactory faceFactory = new FaceTrackerFactory(mGraphicOverlay);
        faceDetector.setProcessor(
                new MultiProcessor.Builder<>(faceFactory).build());

// BarcodeDetector
        BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
        BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(mGraphicOverlay);
        barcodeDetector.setProcessor(
                new MultiProcessor.Builder<>(barcodeFactory).build());

// MultiDetector
        MultiDetector multiDetector = new MultiDetector.Builder()
                .add(faceDetector)
                .add(barcodeDetector)
                .build();

MultiProcessor.Factory

検出器 (Detector) から検出した結果を受け取るためのクラス。

顔とバーコードのそれぞれに対して、 MultiProcessor.Factory を実装 (implements) して、 FaceTrackerFactory と BarcodeTrackerFactory を作成する。

新しいアイテムが検出されると、そのアイテムに対して新しい Tracker インスタンスを作成する。

reference : MultiProcessor.Factory

FrameProcessor

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

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

検出した顔やバーコードの上に図形を表示する

顔とバーコードのそれぞれに対して、GraphicOverlay.Graphic を継承した FaceGraphic と BarcodeGraphic を作成する。

顔は丸、バーコードは長方形のように、異なる図形を表示する。

スクリーンショット

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