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秒程度かかります。