tesseract-android-toolsの導入
画像データをテキストに変換したい。
tesseract-android-toolsを導入する。
前提
Windows (Cygwin) ではビルドできないらしい。
その問題に挑戦するのも面白そう。たぶんやらない。
環境
- Ubuntu 11.04 (VirtualBox)
- Android SDK r21
- Android NDK r8c
ライブラリ
- 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コア数に合わせる・・・なんて話を聞いたことがある。真偽は調べてない。
ビルド後
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 が発生する。
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 にコピーする。
課題
目標は、カメラ撮影した画像を文字認識させること。
そこまでたどり着くには長い道のりが待っている。
- 認識率を検証したい
- 文字や背景の色を変えてみる
- 背景を画像に変えてみる
- 文字を歪ませてみる
- カメラ撮影したままの画像データでは認識率が低い場合
- 画像処理ライブラリを導入(マスキング+エッヂング?)
- OpenCVを使う?(有償の画像処理ライブラリを使いたくない)
- 画像処理ライブラリを導入(マスキング+エッヂング?)
ゴタゴタしたアプリになりそうだ。あー、やだやだ。
参考
- http://datsuns.hatenablog.com/entry/20120105/1325775738
- http://kotohajime-2012.seesaa.net/article/273485628.html
今日の記事は、コトハジメさんの記事を元に、最新の状況に置き換えて書いたものです。
実証も兼ねたつもりなので敢えて似せて書きましたが、本人からの申し立てがありましたら今日の記事は消します。