Tess4J:基于 Java 的 OCR 解决方案

        在现代软件开发中,图像识别与文本提取已成为许多应用场景中的关键环节。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)。其主要流程包括:

  1. 图像预处理:去噪、二值化、灰度处理等,提高识别准确性。
  2. 文字区域检测:定位图像中包含文字的区域。
  3. 字符分割:将连在一起的文字或单词拆分为单个字符。
  4. 字符识别:使用机器学习模型或模板匹配技术识别每个字符。
  5. 后处理与输出:优化识别结果并输出为文本格式。

常见的 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. 执行测试

以下面这个图片为例:

原图片经过去噪、二值化等操作处理后:

识别结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 + JavaScript 父组件点击按钮触发子组件事件方法

在 Vue 3 中&#xff0c;父组件点击按钮触发子组件事件有以下三种常用方式&#xff1a; 方法 1&#xff1a;使用 ref 直接调用子组件方法&#xff08;推荐&#xff09; vue 复制 下载 <!-- 父组件 --> <template><button click"callChildMethod"…

超强人工智能解决方案套件InfiniSynapse:精准的业务理解、对各种数据源进行全模态联合智能分析--部署安装@Ubuntu22.04 @Docker

InfiniSynapse 通过自研的第二代LLM-Native RAG实现了企业业务的理解&#xff0c;精准的Schema召回保证数据的准确性。提供专门为大模型优化的InfiniSQL语言&#xff0c;从而可以更加准确的生成查询语句&#xff0c;通过 InfiniSQL 引擎让人类第一次对存储在各种数据源的全模态…

解决国内无法加载谷歌验证码(reCAPTCHA):URL 重定向配置指南

解决国内无法加载谷歌验证码&#xff08;reCAPTCHA&#xff09;&#xff1a;URL 重定向配置指南 在搭建网站或使用某些应用时&#xff0c;经常会遇到需要调用谷歌验证&#xff08;reCAPTCHA&#xff09;API 的情况。然而&#xff0c;由于网络环境的特殊性&#xff0c;国内多数…

【Qt】如何使用QtInstallerFramework打包Qt程序

使用 Qt Installer Framework 可以将你的 Qt 程序打包成一个带有安装向导的安装包&#xff0c;适用于 Windows、Linux 和 macOS 平台。以下是完整的打包流程&#xff0c;以你当前开发的 ecgexport 应用为例。 &#x1f9f0; 一、准备工作 1. 安装 Qt Installer Framework 下载…

如何编写高效的Prompt:从入门到精通

在人工智能时代&#xff0c;特别是随着大型语言模型(LLM)如ChatGPT、Claude等的普及&#xff0c;编写高质量的Prompt(提示词)已成为一项关键技能。一个好的Prompt可以显著提高AI输出的质量和相关性&#xff0c;而一个糟糕的Prompt可能导致无用甚至误导性的结果。本文将带你深入…

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…

【机械视觉】Halcon—【十三、实例找各个区域面积和中心点】

找区域面积和中心点 *获取图像 read_image (Image, fabrik) *关闭窗口 dev_close_window () *打开窗口 dev_open_window (0, 0, 512, 512, black, WindowID) *设置输出字体&#xff0c;14号字&#xff0c;Courier字体&#xff0c;粗体 set_display_font (WindowID, 14, mono, …

MongoDB 基础

一、MongoDB 基础概念 1. 什么是 MongoDB MongoDB 是一个文档型数据库&#xff0c;数据以类似 JSON 的文档形式存储&#xff0c;使用 BSON 格式。设计理念是应对大数据量1、高性能和灵活性需求。数据组织方式&#xff1a;数据库→2集合→文档&#xff0c;其中集合类似于关系型…

RNN:从记忆困境到序列建模革命

在自然语言处理的战场上&#xff0c;一个句子中的每个单词都承载着前文的记忆。当传统神经网络面对这种时序依赖束手无策时&#xff0c;循环神经网络&#xff08;RNN&#xff09; 以独特的循环结构开启了序列建模的新纪元。它像人类阅读般记忆上下文&#xff0c;却也因记忆衰减…

阳台光伏配套电表ADL200N-CT/D16-Wf-1

安科瑞 华楠 18706163979 引言 在“双碳”目标推动下&#xff0c;绿色能源正逐步走进日常生活。阳台光伏作为一种新型分布式发电方式&#xff0c;凭借灵活安装、高效节能的特点&#xff0c;成为城市家庭和工商业用户的新选择。安科瑞推出的ADL200N-CT/D16-Wf-1阳光光伏电表&a…

功能测试—软件的生命周期

市场需求调研 可行性研究 从企业的人力储备、技术储备、资金储备等方面出发&#xff0c;论证经济效益或者社会效益能否达到预期 项目立项 需求开发 输出&#xff1a;需求规格说明书需求评审&#xff08;需求测试&#xff09;&#xff1a;测试&#xff08;测试负责人、资深测…

PostgreSQL 日常维护

目录 前言 基本使用 1. 登录数据库 2. 数据库操作 2.1 列出库 2.2 创建库 2.3 删除库 2.4 切换库 2.5 查看库大小 3. 数据表操作 3.1 列出表 3.2 创建表 3.3 复制表 3.4 删除表 3.5 查看表结构 4. 模式操作命令 4.1 创建模式 4.2 默认模式 4.3 删除模式 4.4…

STM32F4通用定时器TIM9-TIM14讲解及PWM呼吸灯实例解读

STM32F4通用定时器TIM9-TIM14讲解及PWM呼吸灯实例解读 前言小贴士 通用定时器原理定时器的内部时钟源通用定时器TIM9-TIM14的对比共同点区别 TIM9-TIM14功能说明时基单元计数模式时钟选择 定时器框图理解和分析TIM10/TIM11/TIM13/TIM14输入捕获输出比较 TIM9和TIM12独立通道输入…

whttpserver:一个命令极速搭建文件上传与下载服务器

whttpserver 是一个简单的HTTP服务器&#xff0c;类似于python -m http.server&#xff0c;但增加了文件上传和编辑的功能。 1. 安装 whttpserver 模块 # 临时设置环境变量 PYTHONUTF81&#xff0c;强制 Python 使用 UTF-8 编码 set PYTHONUTF81 pip install whttpserver 2.…

【0.2 漫画操作系统原理】

🖥️ 漫画操作系统原理 🎯 学习目标:深入理解操作系统核心原理,为Java并发编程和性能优化打下坚实基础 🎪 第一章:操作系统初识篇 🤔 什么是操作系统? 想象一下,你是一个大型图书馆的馆长… 📚 没有操作系统 vs 有操作系统没有操作系统: 读者1 → 直接找书架…

第1章 C# 和 .NET 框架 笔记

第1章 C# 和 .NET 框架 1.1 在 .NET 之前 C#为在.NET框架上开发程序而设计的编程语言。 MFC&#xff08;Microsoft Foundation Class&#xff0c;微软基础类库&#xff09; 微软公司提供的一个类库&#xff0c;以 C 类的形式封装了 Windows 的 API&#xff0c;并包含一个应…

Django全栈开发实战与架构思考

一、框架选型与开发范式 作为Python生态最成熟的Web框架&#xff0c;Django的"电池全包"理念在2.3版本后得到更彻底的贯彻。项目初期通过django-admin startproject生成的脚手架已包含&#xff1a; 自动化ORM迁移系统 内置Admin后台管理界面 基于WSGI的中间件管道…

微服务--Gateway网关

1. Gateway简介 Gateway网关是微服务架构中不可或缺的组件&#xff0c;是微服务架构中的统一入口&#xff0c;它作为所有客户端请求的第一道防线&#xff0c;负责请求的路由、过滤和聚合。 Gateway核心功能 路由(Routing) 根据请求路径、Header、参数等将请求路由到不同微服…

区块链与人工智能的融合:从信任到智能的IT新引擎

在信息技术&#xff08;IT&#xff09;的飞速发展中&#xff0c;两大颠覆性技术的交汇正掀起一场革命——区块链与人工智能&#xff08;AI&#xff09;的融合。2025年&#xff0c;随着数据隐私需求的激增、去中心化应用的爆发以及企业对可信智能系统的追求&#xff0c;区块链与…

Javascript什么是原型和原型链,八股文

原型:函数都有prototype属性,称之为原型&#xff0c;也称为原型对象 原型可以放一些属性和方法&#xff0c;共享给实例对象使用 原型可以做继承 原型链:对象都有__proto__属性,这个属性指向它的原型对象,原型对象也是对象,也有__proto__属性,指向原型对象的原型对象,这样一层一…