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

[Android の Mobile Vision API を使って 顔検出する](https://qiita.com/ohwada/items/34e98fa6f4c49bccfffb)
の続きです。

### 概要

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

- [Camera2 API と　Mobile Vision API を使って 顔検出する](
https://qiita.com/ohwada/items/f66dcf14295d9e7c0bf5)

- [Camera2 API と　Mobile Vision API を使って バーコードを検出する](https://qiita.com/ohwada/items/7caf29e1acc28b96042b)

- [Camera2 API と　Mobile Vision API を使って 文字列を検出する](https://qiita.com/ohwada/items/7a09420b4838b4df7a12)

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

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

[googlesamples multi-tracker](https://github.com/googlesamples/android-vision/tree/master/visionSamples/multi-tracker)

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

[reference: CameraSource](https://developers.google.com/android/reference/com/google/android/gms/vision/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)を組み合わせるために使用する。
ソースから受信した１つまたは複数のフレーム上で複数の検出器を一緒に使用することができる。
各検出器は関連する各フレームで別々に実行される。

[reference ; MultiDetector](https://developers.google.com/android/reference/com/google/android/gms/vision/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](https://developers.google.com/android/reference/com/google/android/gms/vision/MultiProcessor.Factory)


### FrameProcessor

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

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

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

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

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


### スクリーンショット
![vision7_detect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/aecfa7fd-f7e4-5f67-6dcb-c3a0dc879ec0.png)


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