Android で OCR を試してみた
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 のプロジェクトから日本語用の学習データをダウンロードします。
- http://code.google.com/p/tesseract-ocr/downloads/list
- tesseract-ocr-3.02.jpn.tar.gz
学習データファイルを assets/tessdata に配置します。
これで準備完了です。
結果
実機を繋げて実行してみます。
レシートをカメラで撮影し数秒待たされて出てきた結果がこれです。
=>
なんか惜しい感じw
所感
このままでは使えない感じですが、ボールド体のはっきりした文字は結構正確に認識しているように見えます。
アプリ側で画像処理を行ってスキャナで取り込んだような画像をライブラリに渡せればもっと精度をあげられるのではないでしょうか。
Android NDK の環境構築
Android の NDK を試そうと開発環境を作ろうとしたら参考サイトのどれも古くて現状と合わないので とりあえず自分でメモ。 現状はEclipseのプラグインが全部やってくれるようです。 と言ってもこれもすぐ古くなっちゃうんだろうな。
前提条件
- 2014年4月時点です。
- Eclipse 4.2 の pleiades です。
- Android-SDK は設定済みです。
- OSは Windows7/64 です。
NDK のインストール
以下のサイトから環境に合う NDK をダウンロードして任意の場所に展開します。
この時点のバージョンは r9d でした。
Eclipse のプラグインのインストール
C/C++ の開発環境
「ヘルプ」->「新規ソフトウェアのインストール」から以下の3つをインストールする。
- URL: http://download.eclipse.org/releases/juno/
- ▽ プログラミング言語
- ■ C/C++ 開発ツール
- ■ C/C++ 開発ツール SDK
- ■ ライブラリ API ドキュメンテーション~
- ▽ プログラミング言語
NDK プラグイン
「ヘルプ」->「新規ソフトウェアのインストール」から以下の1つをインストールする。
- URL: https://dl-ssl.google.com/android/eclipse/
- ▽ NDK プラグイン
- ■ Android ネイティブ開発ツール
- ▽ NDK プラグイン
Eclipse 再起動後、「ウィンドウ」->「設定」から「Android」->「NDK」を選んで NDK Location に展開した NDK のフォルダを設定する。
サンプルプロジェクト
新規プロジェクトで「既存コードからのAndroidプロジェクト」を選びます。
展開した NDK のフォルダの samples フォルダからプロジェクトを選択します。
プロジェクトのメニューから「Androidツール」->「Add Native Support」を選択します。
jni フォルダが認識されます。
JNI は「自動的にビルド」は効かないので手動でプロジェクトのメニューから「プロジェクトをビルド」を選択します。
正常にコンパイルされると各CPUアーキテクチャ用の .so ファイルが生成されます。
この状態で apk を作成すると .so を含んだ形で生成されます。
感想
Eclipseのプラグインが全部やってくれるのでかなり簡単です。
古い NDK の環境設定の解説にはコマンド操作が書いて有ったりしてかえって混乱するので注意してください。