tesseract-android-toolsの導入

画像データをテキストに変換したい。
tesseract-android-toolsを導入する。

前提

  • Android SDK と NDK が正常に動作する Linux 環境が整っていること

Windows (Cygwin) ではビルドできないらしい。
その問題に挑戦するのも面白そう。たぶんやらない。

環境

ライブラリ

  • tesseract-android-tools Revision: 2ce8531565b9
    • tesseract-3.01
    • laptonica-1.69

ビルド手順

$ git clone https://code.google.com/p/tesseract-android-tools/
$ cd tesseract-android-tools/tesseract-android-tools

以降、tesseract-androidtools の README を参照のこと。
#参考記事では leptonica-1.68 だったが、1.69 にバージョンアップされていた

$ curl -0 http://tesseract-ocr.googlecode.com/files/tesseract-3.01.tar.gz
$ curl -0 http://leptonica.googlecode.com/files/leptonica-1.69.tar.gz
$ tar -zxvf tesseract-3.01.tar.gz
$ tar -zxvf leptonica-1.69.tar.gz
$ rm -f tesseract-3.01.tar.gz
$ rm -f leptonica-1.69.tar.gz
$ mv tesseract-3.01 jni/com_googlecode_tesseract_android/src
$ mv leptonica-1.69 jni/com_googlecode_leptonica_android/src
$ ndk-build -j8
$ android update project --path .
$ ant release

補足

ndk-buildコマンド

ndk-build の -j コマンドは、ジョブ数の制限。ジョブ数を指定しないと無限。
CPUコア数に合わせる・・・なんて話を聞いたことがある。真偽は調べてない。

antコマンド

README では debug 指定。
tesseract-ocrの中身を見るつもりはなかったので、今回は release 指定。

$ ant release

ビルド後

JARファイルと動的ライブラリが作成されているか確認。

  • bin(classes.jar)
  • libs
    • armeabi(liblept.so/libtess.so)
    • armeabi-v7a(liblept.so/libtess.so)
    • x86(liblept.so/libtess.so)

tessdataをダウンロード

tesseract-OCR のデータファイルをダウンロード。

$ curl -0 http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.01.eng.tar.gz
$ tar -zxvf tesseract-ocr-3.01.eng.tar.gz
$ rm -f tesseract-ocr-3.01.eng.tar.gz

エミュレータや実機の任意のディレクトリに展開しておく。

adb push eng.traneddata /mnt/sdcard/sample/tessdata/eng.traineddata

補足

tessdata サブディレクトリ内にデータファイルを展開しておかないと、performLaunchActivity の RuntimeException が発生する。

tesseract-android-tool を Windows の Eclipse にインポート

  1. Package Explorer → [Import...]
  2. [General] → [Existing Projects into Workspace]
  3. Select root directory: C:\workspace\tesseract-android-tools
  4. Package Explorer → tesseract-ocr-tools → [Properties]
  5. [Android] → Is Libraty をチェックする

補足

手順2

[Android] → [Existing Android Code into Workspace] にすると、
インポート時に Error "Invalid project description" が発生するので注意。

手順3

[Copy projects into workspace] や [Add project to working sets] はチェックしない

Androidアプリを作成

TextViewを表示するだけのAndroidアプリを作成する。
getText内の処理は、参考記事からの引用。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String text = getText();
    TextView textView = new TextView(this);
    setContentView(textView);
}

private static final String TESSBASE_PATH = "/mnt/sdcard/sample/";
private static final String DEFAULT_LANGUAGE = "eng";

private String getText() {
    final Bitmap bitmap =
            BitmapFactory.decodeResource(getResources(), R.drawable.sample);
    final Bitmap copy =
            bitmap.copy(Config.ARGB_8888, true);

    TessBaseAPI baseApi;
    baseApi = new TessBaseAPI();
    baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
    baseApi.setImage(copy);
    String readText = baseApi.getUTF8Text();
    baseApi.end();

    return readText;
}

適当なテキストのビットマップを作成し、res/drawable/sample.bmp に配置。

プロジェクトを実行すると、文字認識できたっぽい。

起動時にtessdataを展開する

起動時に tessdata を assets から /data/data/package/tessdata にコピーする。

http://outcesticide.hatenablog.com/entries/2012/12/12

課題

目標は、カメラ撮影した画像を文字認識させること。
そこまでたどり着くには長い道のりが待っている。

  • 画像をテキストに変換する
    • OCR(光学文字認識)ライブラリを導入
      • tesseract-android-toolsを使う(今日はここまで)
  • 認識率を検証したい
    • 文字や背景の色を変えてみる
    • 背景を画像に変えてみる
    • 文字を歪ませてみる
  • カメラ撮影したままの画像データでは認識率が低い場合
    • 画像処理ライブラリを導入(マスキング+エッヂング?)
      • OpenCVを使う?(有償の画像処理ライブラリを使いたくない)
  • いちいち撮影ボタンを押さなくても文字認識できたほうがいい
    • tesseract-android-toolの認識率次第(他のOCRライブラリのほうが精度は高いが、価格も・・・)

ゴタゴタしたアプリになりそうだ。あー、やだやだ。

参考

今日の記事は、コトハジメさんの記事を元に、最新の状況に置き換えて書いたものです。
実証も兼ねたつもりなので敢えて似せて書きましたが、本人からの申し立てがありましたら今日の記事は消します。