OCR圖像識别技術的JAVA實作
最近有個需求需要用圖像識别,學習記錄一下。
目前網絡上的開源的圖像識别技術有很多,例如 OCRE(OCR Easy)、Clara OCR、OCRAD、TESSERACT-OCR 等。
今天本blog将記錄下tesseract-ocr的JAVA實作,便于以後查閱使用。
開源 ocr 引擎
我們本次直接以排名第一的 TESSERACT-OCR 作為例子。
TESSERACT-OCR 安裝
本次測試的環境為 windows10,是以下載下傳 windows 相關的安裝包。
windows 下載下傳位址
安裝
安裝完畢後,目錄下:
直接輕按兩下 exe,然後安裝。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CM1QjNlJjMkN2N2MWMkdDM5QDNmVTZyMGMiRTZihzN48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
指定安裝特定語言包
這裡我們安裝一下中文的語言訓練包。
【chinese】相關的四個,簡體,繁體(分别對應的預設和垂直。)
比較悲催的是全部下載下傳失敗。
安裝路徑
使用預設路徑:
C:\Program Files (x86)\Tesseract-OCR
結果
λ ls
ambiguous_words.exe* libcairo-2.dll* libgomp-1.dll* libpangocairo-1.0-0.dll* libwebp-7.dll* tesseract.exe*
classifier_tester.exe* libexpat-1.dll* libharfbuzz-0.dll* libpangoft2-1.0-0.dll* libwinpthread-1.dll* tesseract-uninstall.exe*
cntraining.exe* libffi-6.dll* libintl-8.dll* libpangowin32-1.0-0.dll* lstmeval.exe* text2image.exe*
combine_lang_model.exe* libfontconfig-1.dll* libjbig-2.dll* libpcre-1.dll* lstmtraining.exe* unicharset_extractor.exe*
combine_tessdata.exe* libfreetype-6.dll* libjpeg-8.dll* libpixman-1-0.dll* merge_unicharsets.exe* wordlist2dawg.exe*
dawg2wordlist.exe* libgcc_s_seh-1.dll* liblept-5.dll* libpng16-16.dll* mftraining.exe* zlib1.dll*
doc/ libgif-7.dll* liblzma-5.dll* libstdc++-6.dll* set_unicharset_properties.exe*
iconv.dll* libglib-2.0-0.dll* libopenjp2.dll* libtesseract-4.dll* shapeclustering.exe*
libbz2-1.dll* libgobject-2.0-0.dll* libpango-1.0-0.dll* libtiff-5.dll* tessdata/
驗證版本
>tesseract --version
tesseract v4.0.0.20181030
leptonica-1.76.0
libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.2.0
轉換測試
tesseract D:\code\ocr\src\main\resources\hello.png 1
報錯
C:\Users\binbin.hou>tesseract D:\code\ocr\src\main\resources\hello.png 1
Error opening data file C:\Program Files (x86)\Tesseract-OCR/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract.
配置環境變量
簡單就是說把tessdata拷貝到exe的所在目錄,或者設定 TESSDATA_PREFIX 環境變量
(1)設定系統變量 TESSDATA_PREFIX 值為安裝路徑對應的 data 路徑 C:\Program Files (x86)\Tesseract-OCR\tessdata。
(2)設定 exe 路徑 C:\Program Files (x86)\Tesseract-OCR 添加到 path
然後重新開機電腦即可。
再次驗證
C:\Users\binbin.hou>tesseract D:\code\ocr\src\main\resources\hello.png 1
Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica
其中文本資訊為:
hello ocr
訓練集資料
tessdata 這個檔案夾用來放各種語言的訓練集合資料。
因為中文下載下傳失敗,目前裡面隻有英文的:
λ ls
configs/ eng.user-patterns jaxb-api-2.3.1.jar pdf.ttf piccolo2d-extras-3.0.jar ScrollView.jar
eng.traineddata eng.user-words osd.traineddata piccolo2d-core-3.0.jar script/ tessconfigs/
各種語言庫的下載下傳位址 tessdata
本節暫時不讨論中文相關的處理。
代碼測試
maven 引入
實際原理就是利用 java 指定 cmder 進行調用,為了友善,我們直接引入一個 jar 便于調用。
net.sourceforge.tess4j
tess4j
4.2.1
這裡的 tess4j 的版本和我們安裝的版本是有對應關系的,個人就是因為這個問題排查了半天。
這個 jar 使用的 jdk 為 1.8,請使用 jdk 1.8+ 測試,否則會報錯 Unsupported major.minor version 52.0
應該有适合 jdk1.7 的版本,時間有限,後面嘗試。
圖檔
直接以如下圖檔做測試:
測試代碼
package com.github.houbb.ocr;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
public class Main {
public static void main(String[] args) throws TesseractException {
ITesseract instance = new Tesseract();
// 指定訓練資料集合的路徑
instance.setDatapath("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata");
// 指定識别圖檔
File imgDir = new File("D:\\code\\ocr\\src\\main\\resources\\hello.png");
long startTime = System.currentTimeMillis();
String ocrResult = instance.doOCR(imgDir);
// 輸出識别結果
System.out.println("OCR Result: \n" + ocrResult + "\n 耗時:" + (System.currentTimeMillis() - startTime) + "ms");
}
}
結果
OCR Result:
hello ocr
耗時:1530ms
Process finished with exit code 0
個人了解這個耗時其實意義不是很大,因為一開始需要加載訓練集合文本,是以耗時會較多。
總結
本節使用 java 實作了最基本的文本識别,應用場景還是很多的,等待大家的自己挖掘。
當然預設這裡是不支援中文的,下一節将進行中文的實作學習。
拓展閱讀
參考資料
環境配置
錯誤