Home

Awesome

Android-OCR-Example

練習使用 tess-two 來辨識圖片的文字,因為本人的開發環境是 OS X, 如果是其他作業系統平台的可能要參考一下官方的說明文件喲!!

環境需求

開發環境

環境設定

Install NDK

  1. 先到官方下載 NDK 並解壓縮
  2. 開啓 bashrc or zshrc 將剛剛解壓縮出來的檔案路徑設定到 export
  export ANDROID_NDK="[NDK_PATH]"
  export PATH="$PATH:$ANDROID_SDK/platform-tools:$ANDROID_NDK"

Install ANT

  1. brew install ant

其他平台的人可能需要官方的安裝教學

Build Tess-two

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

Import Tess-two Libary

  1. 先把 tess 中的 tess-two 專案 import 到 eclipse, 並設定他為 Libary Project, 如果有問題請看官方教學
  2. 接著我們的專案就可以 Import tess-two Libary 囉, 如果不知道怎麼使用請參考官方教學

Setting traineddata file

  1. 下載 traineddata 檔 (下載點) - 如果只是要辨識英文就下載 eng, 若是中文則下載 chi.
  2. 透過 adb push 把檔案放到 SDCard - 要注意 tesseract/tessdata/ 這個路徑是固定的喔!!
  adb push ~/Downloads/tesseract-ocr/tessdata/chi_tra.traineddata /mnt/sdcard/tesseract/tessdata/.

API 使用方式

判斷 Bitmap 中的文字

  1. 產生 bitmap 圖片
  private static Bitmap getTextImage(String text, int width, int height) {
    final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    final Paint paint = new Paint();
    final Canvas canvas = new Canvas(bmp);
    
    canvas.drawColor(Color.WHITE);
    
    paint.setColor(Color.BLACK);
    paint.setAntiAlias(true);
    paint.setTextAlign(Align.CENTER);
    paint.setTextSize(24.0f);
    canvas.drawText(text, width / 2, height / 2, paint);
    
    return bmp;
  }
  1. 辨識 bitmap 中的文字
  TessBaseAPI baseApi = new TessBaseAPI();
  baseApi.init("/mnt/sdcard/tesseract/", "chi_tra");
  baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
  baseApi.setImage(getTextImage("你好, hello", 300, 300));
  System.out.println(baseApi.getUTF8Text());

拍照後拍照裡面的文字

  1. 呼叫相機
  private final int cameraResultCode = 1003;
  Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  startActivityForResult(mIntent, cameraResultCode);
  1. 取得拍照後的圖片並判斷
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (resultCode != RESULT_OK) {
      return;
  }

  if (requestCode == cameraResultCode) {
      Bundle extras = data.getExtras();
      Bitmap bmp = (Bitmap) extras.get("data");
      image.setImageBitmap(bmp);
      
      TessBaseAPI baseApi = new TessBaseAPI();
      baseApi.init("/mnt/sdcard/tesseract/", "chi_tra");
      baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
      baseApi.setImage(bmp);
      String outputText = baseApi.getUTF8Text();
      tessResults.setText(outputText);
  }


  super.onActivityResult(requestCode, resultCode, data);
}

執行結果

參考資料來源

  1. https://github.com/rmtheis/tess-two
  2. https://code.google.com/p/tesseract-ocr/downloads/list
  3. http://www.androidadb.com/source/tesseract-android-tools-read-only/tesseract-android-tools-test/src/com/googlecode/tesseract/android/test/TessBaseAPITest.java.html