Androidの OCRライブラリ tess-two (導入編)


# tess-twoとは
[tess-two](https://github.com/rmtheis/tess-two)

OCRライブラリ [Tesseract-OCR](https://code.google.com/p/tesseract-ocr/)を Android NDKに対応したもの。Tesseract-OCRは HP Labで作られ、現在 Googleがプロジェクトを引き継いでいる。

これを使えば Androidでテキストにカメラをかざすことでそのテキストを読み取るアプリケーションを書けるようになるはず。

# 入手とビルド

以下、自分の作業記録。開発環境は Yosemite(10.10.1)。

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

展開すると2つのプロジェクト(tess-two, eyes-two)とテスト(tess-two-test)を確認できる。eyes-twoはOCRに必要なさそうなので今回は手を付けない。

## tess-two
```
cd tess-two
ndk-build
android update project --path .
ant release
```

ビルドはかなり時間がかかる。

```
% tess-two-master/tess-two » ndk-build
[armeabi] Compile thumb  : lept <= adaptmap.c
[armeabi] Compile thumb  : lept <= affine.c
[armeabi] Compile thumb  : lept <= affinecompose.c
...
[mips] Compile++      : tess <= resultiterator.cpp
[mips] Compile++      : tess <= tessbaseapi.cpp
[mips] SharedLibrary  : libtess.so
[mips] Install        : libtess.so => libs/mips/libtess.so

% tess-two-master/tess-two » android update project --path .
Updated local.properties
Added file ./proguard-project.txt

% tess-two-master/tess-two » ant release
Buildfile: /Users/nunocky/tmp/tess-two-master/tess-two/build.xml
...
BUILD SUCCESSFUL
Total time: 1 second
```

※ antは homebrewで入れた。

# tess-two-testを試す

使い方がわからないので、とりあえず同梱されている tess-two-testを動かしてみることにする。

eclipseの「File->Import->Existing Projects into Workspace」で tess-two,　eyes-two, tess-two-testをインポートする。

* tess-two-testにディレクトリ jni/externalを作り、その下に tess-two/libの中身をコピーする。
![スクリーンショット_2014-12-05_16_52_05.png](https://qiita-image-store.s3.amazonaws.com/0/3847/a2938646-7872-e8c2-bce9-6f97225b8053.png "スクリーンショット_2014-12-05_16_52_05.png")

* jni/Android.mkを作る。
共有ライブラリをコピーするためのもの。

```Makefile:Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := liblept
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libtess
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)
```

## tess-two-testのプロパティ設定
* Java Compilerは 1.6を指定。 1.7だとビルドできない。

* Android→Libraryでtess-twoへの依存関係を追加する。
![スクリーンショット 2014-12-05 16.34.55.png](https://qiita-image-store.s3.amazonaws.com/0/3847/f459fa58-1cb5-d97c-fdf4-ede122f71f95.png "スクリーンショット 2014-12-05 16.34.55.png")

* Java Build Path → Librariesでtess-two/bin/tess-two.jarを追加する。
![スクリーンショット 2014-12-05 16.56.48.png](https://qiita-image-store.s3.amazonaws.com/0/3847/37d48ffa-e1cd-dbee-0093-02a33cb60a6f.png "スクリーンショット 2014-12-05 16.56.48.png")

*  Order and Exportのtess-two.jarへのチェックは付けなくていい(この理由がよく分からないが)
![スクリーンショット 2014-12-05 16.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/3847/f1e70639-7152-2288-f2f4-d521b969da95.png "スクリーンショット 2014-12-05 16.56.56.png")


## テストの実行
Android JUnit Testで tess-two-testを動かす。

### 一回目の実行結果:
![スクリーンショット_2014-12-05_17_06_21.png](https://qiita-image-store.s3.amazonaws.com/0/3847/5f32c273-0f21-ca0a-c7c9-2f57860cfacd.png "スクリーンショット_2014-12-05_17_06_21.png")

最後で失敗している。エラーメッセージを確認。


> junit.framework.AssertionFailedError: Make sure that you've copied eng.traineddata to /mnt/sdcard/tesseract/tessdata/eng.traineddata
at com.googlecode.tesseract.android.test.TessBaseAPITest.testGetUTF8Text(TessBaseAPITest.java:94)
> ...

### 再テスト
eng.traineddataは プロジェクトのWebで配布されている。それを指定の場所に入れて再テスト。

![スクリーンショット_2014-12-05_17_13_41.png](https://qiita-image-store.s3.amazonaws.com/0/3847/9121b8c4-56e1-05dc-3a16-a770b58683fb.png "スクリーンショット_2014-12-05_17_13_41.png")

オールグリーン。

しかしテストの結果を見れば分かることだけど tess-two-testの中身は大半が空っぽ。最後のテストだけが　OCRに関係している。


# 次回予定
カメラとの連携はともかく、静止画と範囲を指定してアルファベットの認識くらいはできるようになりたい。