Android の Camera2 API と Mobile Vision API を使って 文字列を検出する


Android の Mobile Vision API を使って バーコードを検出する
の続きです。

概要

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

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

googlesamples : ocr-reader

Cameara API

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

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

余談 : 文字列検出 (Text Detection) のこともを OCR (光学的文字認識 Optical Character Recognition) とも言う。
(Text と Character, Detection とRecognition, 同じ意味合いだが、微妙な違いがある。

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="ocr" />

文字列を検出する

顔検出やバーコード検出のときと同様の処理を行う。

TextRecognizer

TextRecognizer を生成する

  OcrDetectorProcessor processor

        TextRecognizer textRecognizer = new TextRecognizer.Builder(this).build();

        textRecognizer.setProcessor( processor );

reference : TextRecognizer

余談 : 検出器 (Detector) の名称は、
顔検出 と バーコード検出のときは、 FaceDetector とBarcodeDetector ですが、文字列検出は TextRecognizer です。

FrameProcessor

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

このクラスは、バーコード検出のものをそのまま流用する。

余談 : 検出の結果を受け取るための クラス は、
顔検出やバーコード検出のときは、Tracker を継承していて、
名称も Tracker です。
文字列検出だけ、やり方が違う理由は、わからない。

reference : Detector.Processor

検出した文字列の上に長方形を表示する

顔検出やバーコード検出のときと同様の処理を行う。

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

複数の文字列から1つを選ぶ

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

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

余談 : バーコード検出と、コードが微妙に違うが、気にしないことに。

スクリーンショット

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