Tesseract OCR Android

無名_四葉草發表於2020-04-05

轉自:Android之Tesseract OCR

 本文將介紹android平臺上如何使用tesseract實現OCR。 tesseract出生於HP實驗室,如今由Google負責維護,是最好的開源OCR Engine之一,並且支援中文。tesseract個人覺得有兩個需要考慮的點,一是大,二是慢,特別是中文。如果系統對空間和時間要求非常高,那麼tesseract可能不是最好的選擇。

   1.  準備工具tesseract-two

          tesseract是用c++實現的,需要封裝Java API用於Android平臺的呼叫。這裡我們使用的是tesseract-two, 網址是https://github.com/rmtheis/tess-two。tesseract-two 是Tesseract Tools for Android的一個git分支,選擇它是由於操作簡單,並且整合了leptonica,一個圖形處理工具。出發之前請先安裝git和android-ndk。接著便是下載和編譯,我是在windows上編譯的。

       git下載(Git Bash操作):  git clone https://github.com/rmtheis/tess-two.git tess 

       ndk編譯(cmd命令列):  先cd到剛才Git下載的tess目錄。敲如下命令(編譯的時間會有點久):

[plain] view plaincopy
  1. cd tess-two  
  2. ndk-build  
  3. android update project -t 1 --path .  
  4. ant release  
  5.   
  6.   
  7. cd ..  
  8. cd eyes-two  
  9. ndk-build  
  10. android update project -t 1 --path .  
  11. ant release  

    2. 呼叫tesseract識別圖片

      eclipse裡面匯入編譯好的android project,共三個專案,tess-two, tess-two-test 以及eyes-two。其中tess-two和eyes-two為android lib專案,供其它專案引用。tess-two封裝Tesseract的Android API,eyes-two封裝leptonica的Android API。tess-two-test為OCR的測試,先讀一下TessBaseAPITest.java的程式碼,瞭解API的使用方法。
[java] view plaincopy
  1.        private static final String TESSBASE_PATH = "/mnt/sdcard/tesseract/";  
  2. private static final String DEFAULT_LANGUAGE = "eng";  
  3. private static final String CHINESE_LANGUAGE = "chi_sim";  
  4.   
  5.        TessBaseAPI baseApi = new TessBaseAPI();  
  6.        baseApi.init(TESSBASE_PATH, CHINESE_LANGUAGE);  
  7. baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO);  
  8. baseApi.setImage(params[0]);  
  9.   
  10. // Ensure that the result is correct.  
  11. final String outputText = baseApi.getUTF8Text();  
  12. baseApi.end();  


基本的API呼叫步驟非常之簡單。不過模擬器啟動之後,還需要把Tesseract的trained data放到模擬器裡面,下載地址為https://code.google.com/p/tesseract-ocr/downloads/list

adb shell 
cd /mnt/sdcard/

mkdir tesseract

cd tesseract

mkdir tessdata

Ctrl+C退出Shell

adb push chi_sim.traineddata /mnt/sdcard/tesseract/tessdata

adb push eng.traineddata /mnt/sdcard/tesseract/tessdata

嘗試自己寫個Activity,顯示張圖片並識別一下吧。


3.  寫在最後

    OCR的識別率取決於兩個方面,圖片質量和OCR engine的能力。通常為了提高識別率,需要對圖片作預處理。比如常見的二值化(黑白),放大,切割,銳化等。可以直接呼叫leptonica介面實現。至於Tesseract Engine,只能說是非常好的英文OCR engine,處理中文還是有待提高。選擇好一個OCR engine之後,能做的估計也就是在圖片的預處理上下功夫了。


相關文章