Nexus5 を買いました。 実機でカメラが使えるようになったので OCR をやって見たいと思います。

Android 用の OCR ライブラリ

Google の OSS である Tesseract OCR をAndroid用に NDK でコンパイルするのがスタンダードなようです。

Tesseract OCR は C++ で記述されているので Android 向けの JavaAPI を被せた tess-two というプロジェクトを使います。

その他、NHocr と言うのが有るようですが Android 用の環境が良く分からないので今回はパスします。

tess-two プロジェクトのチェックアウトとコンパイル

tess-two は NDK の開発環境を必要とするので事前に構築してください。 -> Android NDK の環境構築

Eclipse で以下の git をクローンします。

  • https://github.com/rmtheis/tess-two.git

GITリポジトリの中から tess-two フォルダをインポートします。

プロジェクトのメニューから「Androidツール」->「Add Native Support」を選択します。

コンソールにこんなエラーが出ている場合は API Level 8 の SDK を追加するか AndroidManifest.xml と product.properties の API Level を書き換えて下さい。

JNI は「自動的にビルド」は効かないので手動でプロジェクトのメニューから「プロジェクトをビルド」を選択します。

結構長いことコンパイルが走って4種類のCPU用の .so ファイルが生成されます。

これでライブラリの準備が完了です。

サンプルプロジェクトのチェックアウトとコンパイル

インド人の Gautam Gupta さんのサンプルを使わせてもらいます。

Eclipse で以下の git をクローンしてプロジェクトをインポートします。

  • https://github.com/GautamGupta/Simple-Android-OCR.git

プロジェクトのプロパティの Android に tess-two プロジェクトをライブラリとして追加します。



SimpleAndroidOCRActivity.javaを開いてソースコードを一部修正します。

super.onCreate()の呼び出しをメソッドの最初に移動します。
※Kitkatで動かなかったため

94:         super.onCreate(savedInstanceState);
↓
47:     public void onCreate(Bundle savedInstanceState) {
48:         super.onCreate(savedInstanceState);

言語指定を英語から日本語に変更します。

34:     public static final String lang = "eng";
                                           ↓
34:     public static final String lang = "jpn";

tess-two のプロジェクトから日本語用の学習データをダウンロードします。

学習データファイルを assets/tessdata に配置します。

これで準備完了です。

結果

実機を繋げて実行してみます。

レシートをカメラで撮影し数秒待たされて出てきた結果がこれです。

=>

なんか惜しい感じw

所感

このままでは使えない感じですが、ボールド体のはっきりした文字は結構正確に認識しているように見えます。

アプリ側で画像処理を行ってスキャナで取り込んだような画像をライブラリに渡せればもっと精度をあげられるのではないでしょうか。