Camera2 API と Mobile Vision API を使って 顔検出する
の続きです。
概要
前回の記事では、カメラからの連続画像から顔を検出した。
今回の記事では、カメラからの連続画像からバーコードを検出する。
下記の公式サンプルコードでは、カメラの制御に 旧来の Cameara API を使っている。
この記事では、Camera2 API を使って 同様の機能を持つ アプリを作成する。
前回の記事で作成した顔検出のアプリをベースにする。
Mobile Vision API を使ったバーコード検出 に関して下記の記事を参考にした。
-
[Mobile Vision Barcode APIを用いたバーコード機能の実装方法]
(https://www.rozkey59.tokyo/entry/2018/03/26/225014)
Mobile Vision API の設定
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 を継承して作成する
検出したバーコードの上に長方形を表示する
顔検出のときと同様の処理を行う。
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