tesseract 是非常著名的Open Source 的文字辨識套件。
透過tesseract-ocr進行影像辨識之成果如下圖,可以看到整體辨識的準確度非常高。
要在Android 上運行文字辨識需要完成以下幾個步驟 :
1. 載入相依套件(tesseract-ocr)
2. 載入辨識用模型
3. 開啟存取權限
4. 進行辨識
1. 載入相依套件(tesseract-ocr)
先在專案中的build.gradl 中增加 tess-two 的套件包。
compile 'com.rmtheis:tess-two:6.0.0'
2. 載入辨識用模型
取得訓練好的資料 (連結),主要應用可參考之語言包如下:
1. eng 英文
2. chi_tra 繁體中文
3. chi_sim 簡體中文
3. 開啟存取權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
4.進行辨識
宣告tesseract的辨識模型的位置與要使用的語言包。
static final String TESSBASE_PATH = "/storage/emulated/0/download/tesseract/";
static final String DEFAULT_LANGUAGE = "eng";
static final String CHINESE_LANGUAGE = "chi_tra";
以下函數為進行文字辨識之主要程式碼。
透過TessBaseAPI進行文字辨識,init 方法進行模組的初始化第一個參數為資料目錄,第二個參數為辨識的語言。
PageSegMode.PSM_SINGLE_LINE 是指來源影像之中只有單行文字需要進行辨識處理。
透過 setImage 方法設定需辨識的目標影像,再透過getUTF8Text取得辨識結果。
處理完後須主動釋放資源。
public String ocrWithEnglish() {
String resString = "";
imgSrc.setDrawingCacheEnabled(true);
final Bitmap bitmap = imgSrc.getDrawingCache();
final TessBaseAPI ocrApi = new TessBaseAPI();
ocrApi.init(TESSBASE_PATH, CHINESE_LANGUAGE);
ocrApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
ocrApi.setImage(bitmap);
resString = ocrApi.getUTF8Text();
ocrApi.clear();
ocrApi.end();
return resString;
}
此處較為關鍵之處為 辨識模型得路徑設定。
查閱原始碼中發現TessBaseAPI在進行初始化時會主動在路徑中加入tessdata的目錄夾。
因此需在TESSBASE_PATH所設定的路徑底下新增一個tessdata的資料夾,並在裡面放入辨識的語言模型。
若來源影像之中不僅只有單行文字需要進行辨識處理時可以參考其他設定(專案原始碼參考連結)。
範例專案 (連結)
文章標籤
全站熱搜

您好 由於是新手 仍然有眾多不熟悉之處很想要進行這樣的APP 不知道您有沒有完整的程式碼呢? 謝謝!
依照本篇教學添加一個簡單的範例專案於github中網址如下: https://github.com/Lung-Yu/Blog-samples/tree/master/app/OCR%20Sample 專案中使用之辨識模型可於model資料夾下載(內含中文、英文兩個) 專案為撥空依照教學撰寫,於Android 6.0 手機運作時,需自行給予權限否則無法讀取手機中之模型檔。需稍加注意。 ※ 貼心提醒,模型檔需事先放置於對應位置,需與程式相互對應。
為什麼我執行程式會出現"很抱歉,OCR_Sample已停止" 就跳離畫面了
如果手機是Android 6.0 以上的版本,可能要確定一下是否有給APP執行權限(讀取檔案需要權限)。 手動部分可以 -> 設定-> APP 管理 -> OCR_Sample -> 權限 -> (將相關權限開啟 )
請問為什麼開啟後只能辨識一ˋ次 想要再辨識必須要整個重開才可以?
APP只能辨識一次嗎? 應該是new TessBaseAPI(); 只能辨識一次,若要重新辨識則需要重新建立一個 TessBaseAPI 的實體才能辨識。
有一些問題想請問: 1. "辨識用模型"下載完要放在專案檔的哪一個位置? 2. TESSBASE_PATH 這個路徑是根據你放置模型的的位置來寫的嗎?我找不到"/storage/emulated/0/download/tesseract/"這個路徑
1.都可以,程式可以抓得到就可以。 常見手法包含,程式自動在sd卡上建立一個這個app專用的空間,然後自動下載模型檔到裡面。也可以放在專案內,程式直接設定也可以,程式內部應該可以考慮用assest。 2.對,看你最後放哪裡,download 那個路徑是我在做這個案例時,放的位置,實際要依照你的狀況調整路徑。
想再請問, "1. 載入相依套件(tesseract-ocr)" 這個步驟,除了輸入程式碼compile 'com.rmtheis:tess-two:6.0.0',還需要下載什麼東西進去這個專案檔嗎?或是要做什麼設定? 我目前是把辨識用模型放在專案檔的assests中,但是無法執行,不知道我是路徑有錯誤,還是有什麼東西沒下載或設定到
1. 不需要做特殊的設定 2. assests 我本身是沒有測試過,那這個github的範例你去執行是可以成功運作的嗎? 如果可以要不要用這個專案 改成讀取assests 的模型黨做嘗試。如果用這個專案改就可以成功,就代表事有什麼設定沒設定好,如果不行,則可能是assest讀取會有問題?
我後來不知道為什麼就成功了XD 謝謝囉~
哈哈, 使用assets 成功的嗎, 恭喜啊!
想請問步驟4.的宣告tesseract的辨識模型的位置與要使用的語言包。 是要在哪個文件下宣告的呢? ^ ^
API初始化(下面這行程式碼)的時候,需要設定要用哪個語言模型進行辨識~ ocrApi.init(TESSBASE_PATH, CHINESE_LANGUAGE);
為甚麼我全都照上面的步驟做了一開啟app卻還是閃退呢? 請問有甚麼原因會使他閃退呢?QQ
是執行到哪個步驟的時候當掉呢? 可以試著用中斷點來檢查~ 或者有什麼錯誤訊息嗎? 用github上面的專案是可以執行的嗎?
喔 我做出來了 謝謝你^ ^
恭喜恭喜!
請問一下,如何將TESSBASE_PATH改成內部儲存的路徑, 因為手機沒有sd card 會找不到此路徑。
基本上看你本地儲存的路徑,用程式讀出來試試看~ 如果可以讀的到,把路徑貼過去就可以了