????????在現代軟件開發中,圖像識別與文本提取已成為許多應用場景中的關鍵環節。OCR(Optical Character Recognition) 技術使得從圖像中提取文字成為可能。Tess4J 是一個基于 Java 的 OCR 開發庫,它封裝了 Google Tesseract OCR 引擎的本地調用接口,使得 Java 開發者能夠輕松地在項目中集成圖像文字識別功能。
????????Tess4J 的核心優勢在于其對原生 Tesseract 庫的封裝,不僅簡化了 API 調用流程,還支持跨平臺使用(Windows、Linux、MacOS 等),是 Java 圖像識別領域的重要工具之一。
1. OCR 介紹
????????OCR(Optical Character Recognition,光學字符識別) 是一種將圖像中的文字內容轉換為可編輯、可搜索的文本格式的技術。它廣泛應用于從掃描文檔、照片、PDF 文件等圖像中提取文字信息,實現自動化數據處理和分析。其核心是通過圖像處理與模式識別算法來檢測圖像中的字符區域,并將其識別為計算機可理解的文本格式(如 ASCII 或 Unicode)。其主要流程包括:
- 圖像預處理:去噪、二值化、灰度處理等,提高識別準確性。
- 文字區域檢測:定位圖像中包含文字的區域。
- 字符分割:將連在一起的文字或單詞拆分為單個字符。
- 字符識別:使用機器學習模型或模板匹配技術識別每個字符。
- 后處理與輸出:優化識別結果并輸出為文本格式。
常見的 OCR 工具與服務:
工具/服務名稱 | 平臺/語言支持 | 支持語言 | 是否付費 | 特點說明 |
Tesseract OCR | 跨平臺(C/C++),支持 Java(Tess4J)等封裝 | 英文為主,支持幾十種語言(需加載對應 tessdata 文件) | 否 | 開源免費,適合本地部署,精度中等 |
Google Vision API | 云端 REST API | 多語言支持:英文、中文、日文、韓文、法語等(共約 50+ 種語言) | 是 | 高精度識別,支持表格、手寫體、復雜排版,需網絡連接 |
百度 OCR | 云端 API / SDK | 中文、英文、數字、車牌、身份證、護照等特定場景 | 部分免費 | 中文識別強,適合國內應用場景,有免費額度限制 |
ABBYY FineReader | Windows / macOS | 支持 190+ 種語言 | 是 | 商業軟件,識別準確率高,界面友好,價格較高 |
Microsoft Azure Computer Vision | 云端 API | 英文、中文、西班牙語、法語、德語、日語等主流語言 | 是 | 支持多語言和表格識別,集成于 Azure 生態 |
Amazon Textract | AWS 云端服務 | 英文、中文、西班牙語等 | 是 | 提取文檔中的文本、表格、表單結構,適合企業級文檔處理 |
OpenCV + 深度學習模型 | 自定義開發(Python、Java 等) | 取決于訓練模型(可定制化) | 否 | 靈活但開發門檻高,適合有 AI 能力的團隊 |
MyScript | Web / SDK | 英文、中文、日文、阿拉伯語等 | 是 | 手寫識別能力強,適合教育、筆記類應用 |
PaddleOCR(百度飛槳) | Python / C++ / Java | 支持中英文、數字、符號、多種字體 | 否 | 開源項目,輕量級,適合本地部署或自定義訓練 |
?2.?簡單驗證碼識別(無干擾項)使用步驟
1.?添加依賴
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.2.1</version>
</dependency>
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.1</version>
</dependency>
2.?下載 Tesseract 數據
下載地址:https://github.com/tesseract-ocr/tessdata
這里以放在 resources/tessdata 目錄為例:
常見語言包列表及用途說明:
參考文檔:Traineddata Files for Version 4.00 + | tessdoc?
文件名 | 語言 | 備注 |
afr.traineddata | 南非語 (Afrikaans) | —— |
amh.traineddata | 阿姆哈拉語 (Amharic) | —— |
ara.traineddata | 阿拉伯語 (Arabic) | —— |
asm.traineddata | 阿薩姆語 (Assamese) | —— |
aze.traineddata | 阿塞拜疆語 (Azerbaijani) | —— |
aze_cyrl.traineddata | 阿塞拜疆語(西里爾字母) | Cyrillic 字符集 |
bel.traineddata | 白俄羅斯語 (Belarusian) | —— |
ben.traineddata | 孟加拉語 (Bengali) | —— |
bod.traineddata | 藏語 (Tibetan) | —— |
bos.traineddata | 波斯尼亞語 (Bosnian) | —— |
bre.traineddata | 布列塔尼語 (Breton) | —— |
bul.traineddata | 保加利亞語 (Bulgarian) | —— |
cat.traineddata | 加泰羅尼亞語 (Catalan; Valencian) | —— |
ceb.traineddata | 宿務語 (Cebuano) | —— |
ces.traineddata | 捷克語 (Czech) | —— |
chi_sim.traineddata | 中文簡體 (Chinese - Simplified) | 常用字識別 |
chi_sim_vert.traineddata | 中文簡體豎排 | 豎排文字識別 |
chi_tra.traineddata | 中文繁體 (Chinese - Traditional) | —— |
chi_tra_vert.traineddata | 中文繁體豎排 | —— |
chr.traineddata | 切羅基語 (Cherokee) | —— |
cym.traineddata | 威爾士語 (Welsh) | —— |
dan.traineddata | 丹麥語 (Danish) | —— |
dan_frak.traineddata | 丹麥語(Fraktur 字體) | 古德語字體風格 |
deu.traineddata | 德語 (German) | —— |
deu_frak.traineddata | 德語(Fraktur 字體) | —— |
div.traineddata | 迪維希語 (Dhivehi) | —— |
dzo.traineddata | 不丹語 (Dzongkha) | —— |
ell.traineddata | 希臘語 (Greek, Modern) | —— |
eng.traineddata | 英語 (English) | 推薦使用 |
enm.traineddata | 中古英語 (Middle English) | 古英語識別 |
epo.traineddata | 世界語 (Esperanto) | —— |
est.traineddata | 愛沙尼亞語 (Estonian) | —— |
eus.traineddata | 巴斯克語 (Basque) | —— |
fas.traineddata | 波斯語 (Persian) | —— |
fao.traineddata | 法羅語 (Faroese) | —— |
fra.traineddata | 法語 (French) | —— |
frm.traineddata | 中古法語 (Middle French) | —— |
fry.traineddata | 弗里斯蘭語 (Western Frisian) | —— |
gla.traineddata | 蘇格蘭蓋爾語 (Scottish Gaelic) | —— |
gle.traineddata | 愛爾蘭語 (Irish) | —— |
glg.traineddata | 加利西亞語 (Galician) | —— |
grc.traineddata | 古希臘語 (Ancient Greek) | —— |
guj.traineddata | 古吉拉特語 (Gujarati) | —— |
hat.traineddata | 海地克里奧爾語 (Haitian; Haitian Creole) | —— |
heb.traineddata | 希伯來語 (Hebrew) | —— |
hin.traineddata | 印地語 (Hindi) | —— |
hrv.traineddata | 克羅地亞語 (Croatian) | —— |
hun.traineddata | 匈牙利語 (Hungarian) | —— |
hye.traineddata | 亞美尼亞語 (Armenian) | —— |
iku.traineddata | 因紐特語 (Inuktitut) | —— |
ind.traineddata | 印度尼西亞語 (Indonesian) | —— |
isl.traineddata | 冰島語 (Icelandic) | —— |
ita.traineddata | 意大利語 (Italian) | —— |
ita_old.traineddata | 意大利語(舊字體) | —— |
jav.traineddata | 爪哇語 (Javanese) | —— |
jpn.traineddata | 日語 (Japanese) | 含平假名、片假名和常用漢字 |
jpn_vert.traineddata | 日語豎排 | —— |
kan.traineddata | 卡納達語 (Kannada) | —— |
kas.traineddata | 克什米爾語 (Kashmiri) | —— |
kat.traineddata | 格魯吉亞語 (Georgian) | —— |
kat_old.traineddata | 格魯吉亞語(舊字體) | —— |
kaz.traineddata | 哈薩克語 (Kazakh) | —— |
khm.traineddata | 高棉語 (Central Khmer) | —— |
kir.traineddata | 吉爾吉斯語 (Kyrgyz) | —— |
kmr.traineddata | 庫爾德語北部方言 (Northern Kurdish) | —— |
kor.traineddata | 韓語 (Korean) | —— |
kor_vert.traineddata | 韓語豎排 | —— |
lao.traineddata | 老撾語 (Lao) | —— |
lat.traineddata | 拉丁語 (Latin) | —— |
lav.traineddata | 拉脫維亞語 (Latvian) | —— |
lit.traineddata | 立陶宛語 (Lithuanian) | —— |
ltz.traineddata | 盧森堡語 (Luxembourgish) | —— |
mal.traineddata | 馬拉雅拉姆語 (Malayalam) | —— |
mar.traineddata | 馬拉地語 (Marathi) | —— |
mkd.traineddata | 馬其頓語 (Macedonian) | —— |
mlt.traineddata | 馬耳他語 (Maltese) | —— |
mon.traineddata | 蒙古語 (Mongolian) | —— |
mri.traineddata | 毛利語 (Maori) | —— |
msa.traineddata | 馬來語 (Malay) | —— |
mya.traineddata | 緬甸語 (Burmese) | —— |
nep.traineddata | 尼泊爾語 (Nepali) | —— |
nld.traineddata | 荷蘭語 (Dutch; Flemish) | —— |
nor.traineddata | 挪威語 (Norwegian) | —— |
oci.traineddata | 奧克西坦語 (Occitan) | —— |
ori.traineddata | 奧里亞語 (Oriya) | —— |
osd.traineddata | 方向與段落檢測 | —— |
pan.traineddata | 旁遮普語 (Eastern Punjabi) | —— |
pap.traineddata | 帕皮阿門托語 (Papiamento) | —— |
pol.traineddata | 波蘭語 (Polish) | —— |
por.traineddata | 葡萄牙語 (Portuguese) | —— |
pus.traineddata | 普什圖語 (Pashto) | —— |
que.traineddata | 克丘亞語 (Quechua) | —— |
ron.traineddata | 羅馬尼亞語 (Romanian; Moldavian; Moldovan) | —— |
rus.traineddata | 俄語 (Russian) | —— |
san.traineddata | 梵語 (Sanskrit) | —— |
sin.traineddata | 僧伽羅語 (Sinhala) | —— |
slk.traineddata | 斯洛伐克語 (Slovak) | —— |
slv.traineddata | 斯洛文尼亞語 (Slovenian) | —— |
snd.traineddata | 信德語 (Sindhi) | —— |
spa.traineddata | 西班牙語 (Spanish; Castilian) | —— |
spa_old.traineddata | 西班牙語(舊字體) | —— |
sqi.traineddata | 阿爾巴尼亞語 (Albanian) | —— |
srp.traineddata | 塞爾維亞語 (Serbian) | —— |
srp_latn.traineddata | 塞爾維亞語(拉丁字母) | —— |
sun.traineddata | 巽他語 (Sundanese) | —— |
swa.traineddata | 斯瓦希里語 (Swahili) | —— |
swe.traineddata | 瑞典語 (Swedish) | —— |
syr.traineddata | 敘利亞語 (Syriac) | —— |
tam.traineddata | 泰米爾語 (Tamil) | —— |
tat.traineddata | 韃靼語 (Tatar) | —— |
tel.traineddata | 泰盧固語 (Telugu) | —— |
tgk.traineddata | 塔吉克語 (Tajik) | —— |
tgl.traineddata | 他加祿語 (Tagalog) | —— |
tha.traineddata | 泰語 (Thai) | —— |
tir.traineddata | 提格利尼亞語 (Tigrinya) | —— |
ton.traineddata | 湯加語 (Tonga) | —— |
tur.traineddata | 土耳其語 (Turkish) | —— |
uig.traineddata | 維吾爾語 (Uighur; Uyghur) | —— |
ukr.traineddata | 烏克蘭語 (Ukrainian) | —— |
urd.traineddata | 烏爾都語 (Urdu) | —— |
uzb.traineddata | 烏茲別克語 (Uzbek) | —— |
uzb_cyrl.traineddata | 烏茲別克語(西里爾字母) | —— |
vie.traineddata | 越南語 (Vietnamese) | —— |
yid.traineddata | 意第緒語 (Yiddish) | —— |
yor.traineddata | 約魯巴語 (Yoruba) | —— |
3.?編寫識別代碼
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;import java.io.File;public static void main(String[] args) {String dataPath = "src/main/resources/tessdata";String imagePath = "src/main/resources/image/img.png";try {// 獲取本地圖片File file = new File(imagePath);// 創建Tesseract對象ITesseract tesseract = new Tesseract();// 設置字體庫路徑tesseract.setDatapath(dataPath);// 設置識別語言tesseract.setLanguage("eng");// 執行ocr識別String result = tesseract.doOCR(file);System.out.println("識別的結果為:" + result);} catch (Exception e) {e.printStackTrace();}
}
3.?復雜驗證碼識別(帶干擾項)使用步驟
1.?加入maven依賴
<dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.9.0-0</version>
</dependency>
2.?選擇和 maven 依賴相同版本的 opencv下載
?下載地址:https://sourceforge.net/projects/opencvlibrary/files/
以該示例為例,Windows 版本下載如下圖所示:
選擇下載位置后點擊安裝即可。?
選擇版本說明:
1. 點擊?Core.NATIVE_LIBRARY_NAME 常量:
2. 點擊?getNativeLibraryName() 方法:
這個就是要找的 dll 文件,即 opencv 的版本。這個常量根據 opencv 版本的不同,常量也隨之變化。
3.?帶干擾項驗證碼處理(灰度化、二值化等操作)
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;import java.io.File;
import java.io.IOException;public class CaptchaPreprocessor {static {//在使用OpenCV前必須加載Core.NATIVE_LIBRARY_NAME類,否則會報錯System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String[] args) throws IOException {String imagePath = "src/main/resources/img.png";String outputImagePath = "src/main/resources/img/img.png";String tessDataPath = "src/main/resources/tessdata";try {// 1. 使用 OpenCV 預處理圖像Mat src = Imgcodecs.imread(imagePath, Imgcodecs.IMREAD_COLOR);if (src.empty()) {System.err.println("無法加載圖像,請檢查路徑是否正確:" + imagePath);return;}Mat processed = new Mat();// 灰度化Mat gray = new Mat();Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);// 對比度增強(CLAHE)Mat clahe = new Mat();Imgproc.createCLAHE(2.0, new org.opencv.core.Size(8, 8)).apply(gray, clahe);// 自適應二值化Mat binary = new Mat();Imgproc.adaptiveThreshold(clahe, binary, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,Imgproc.THRESH_BINARY, 11, 2);// 形態學操作去干擾線Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(1, 3));Imgproc.morphologyEx(binary, processed, Imgproc.MORPH_OPEN, kernel);// 保存處理后的圖像File destF = new File(outputImagePath).getParentFile();if (!destF.exists()) {destF.mkdirs();}boolean success = Imgcodecs.imwrite(outputImagePath, processed);if (!success) {System.err.println("圖像保存失敗,請檢查路徑或 Mat 是否為空");}// 2. 使用 Tess4J 進行 OCR 識別ITesseract tesseract = new Tesseract();tesseract.setDatapath(tessDataPath); // 設置 tessdata 路徑tesseract.setLanguage("eng"); // 英文識別tesseract.setPageSegMode(7); // 單行文本識別File imageFile = new File(imagePath);String result = tesseract.doOCR(imageFile);// 輸出識別結果System.out.println("識別結果: " + result.trim());} catch (Exception e) {System.err.println("識別失敗: " + e.getMessage());e.printStackTrace();}}
}
4. 配置 VM options,添加 -Djava.library.path=安裝位置\opencv\build\java\x64。(如果 java -jar 啟動的話,可以直接添加?-Djava.library.path=安裝位置\opencv\build\java\x64 或 --java.library.path=安裝位置\opencv\build\java\x64)
以配置 VM options 為例,具體操作流程如下圖所示:
關于配置?java.library.path 說明:
1. 在未配置 -Djava.library.path 之前啟動項目會報如下錯誤:
2. 點擊?ClassLoader.java:1863
從該圖可以看出,他讀取?java.library.path 和?sun.boot.library.path 這兩個路徑。所以說?-Djava.library.path 可以替換為 -Dsun.boot.library.path。
4. 執行測試
以下面這個圖片為例:
原圖片經過去噪、二值化等操作處理后:
識別結果為: