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



