2015年5月22日金曜日

Ingress 「Agent Stats」がデータアップ時サーバエラーで使えないので。。 tesseract-ocrのビルド

Ingress用のAndroidの「Agent Stats」ですが、Ingressのprofileのスクリーンショットを共有でサーバサイトに送信するとOCRで読み取ってくれて、実績を管理してくれるのですが、
人気なのかサーバ過負荷だと思いますが、エラーで全然認識してくれません。><

(本記事は、一般向けではありませんので、「Agent Stats」で検索して来られた方は、
お役に立ちません。すみません。アプリが完成すれば別ですが。)


そこで、自分で作ってみることにしました。「Agent Stats」はサーバサイドでOCRで読み取って
いますが、今回はAndroid端末側でOCR機能を入れて読み取れないかまず試してみました。

第一ステップ:Android端末の方でOCR認識して、データを文字列に置き換えてできるか。
まず、AndroidでOCRライブラリーを探したところ、
https://github.com/rmtheis/tess-two
があり、ネイティブコード(C/C++)で作られています。jniですので、Android NDKが必要になります。
NDKは、Windowsでは面倒くさいので、Linux(CentOS7)上でコンパイル環境を構築することにします。

【ndk-build環境の構築】CentOS7

1.Android NDKのインストール
 1) wget http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
 2) chmod +x android-ndk-r10e-linux-x86_64.bin
 3) android-ndk-r10e-linux-x86_64.bin
 4) mv android-ndk-r10e /usr/local/
 5) echo 'export PATH=$PATH:/usr/local/android-ndk-r10e' >> .bashrc
 6) echo 'export NDKROOT=/usr/local/android-ndk-r10e' >> .bashrc

2.Android SDKのインストール
 1) wget http://dl.google.com/android/android-sdk_r24.2-linux.tgz
 2) tar zxvf android-sdk_r24.2-linux.tgz
 3) mv android-sdk-linux /usr/local/
 4) echo 'export PATH=$PATH:/usr/local/android-sdk-linux/tools/' >> .bashrc
 5) echo 'export PATH=$PATH:/usr/local/android-sdk-linux/platforms' >> .bashrc

3.その他必要モジュール
 ビルド時、/usr/local/android-sdk-linux/build-tools/22.0.1/aapt実行時に必要
 モジュールがなくエラーが出る場合は、必要なモジュールをインストールすること。
 私の環境では、以下3つが必要でした。

  1) yum install ld-linux.so.2
  2) yum install libz.so.1
  3) yum install libstdc++.so.6

【tesseract-ocrのビルド】 作者に感謝。

 1) git clone git://github.com/rmtheis/tess-two tess
 2) cd tess
 3) cd tess-two
 4) ndk-build
 5) android update project --path .
 6) ant release

 成功すると以下にオブジェクトが出来ます。
 ./bin/classes.jar
 ./libs/armeabi-v7a/liblept.so
                           /libtess.so
       /mips/liblept.so
               /libtess.so
       /x86/liblept.so
              /libtess.so

 以上をEclipsプロジェクトのlibsフォルダーにコピーすればもうOCR読み取り
 関数が使えます。

【OCR読み取りツール】EclipsはWindows上で開発しています。
  とりあえずこんな感じで、まずは文字が読めるかみました。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;

Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/Pictures/ingress/profile_20150507_202910_0.png", options);
bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

Log.v(TAG, "-- START");

TessBaseAPI baseApi = new TessBaseAPI();
baseApi.setDebug(true);
baseApi.init(DATA_PATH, lang);
baseApi.setImage(bitmap);

String recognizedText = baseApi.getUTF8Text();

baseApi.end();

Log.v(TAG, "-- END);

読み取り画像 テストアプリで読み取り後
すばらしい。読み取れてる!。読み取り時間は、ネイティブコードにしても8秒程度かかります。
(金色のグラディエーションが係ってるタグ欄は文字化けしているけどこれは読み取れなくともいいので)
使えることが分かったので、第二ステップ以降は時間のある時に作成します。
とりあえず、CSVにしてデータをメール転送ならさくっとできそうです。

OCR読み取りの作成部分は今後、仕事にも生かせそうです。


0 件のコメント:

コメントを投稿