工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案_java最强的ocr识别
简介
OCR(Optical Character Recognition,光学字符识别)是一种将图像中的文字内容自动识别并转换为可编辑、可搜索文本的技术。它广泛应用于文档数字化、票据识别、身份证扫描、车牌识别等场景。
OCR 的核心流程通常包括以下几个步骤:
-
图像预处理:对输入图像进行灰度化、去噪、二值化等处理,提高识别准确率。
-
文本检测:定位图像中出现文字的位置(即检测出文字框)。
-
方向分类:判断文字方向,确保后续识别按正确的方向进行(如是否旋转了90°)。
-
字识别:将检测到的文字区域逐个识别为具体的字符或字符串。
-
后处理:对识别结果进行排序、去噪、拼接或结构化处理,提升可读性和准确性。
现代 OCR 系统往往结合深度学习算法(如 CRNN、Transformer、PP-OCR 等),在复杂场景下依然能保持较高的准确率,甚至能识别手写体、多语言、竖排文本等。
本篇文章将手把手教你如何使用 SmartJavaAI 实现 OCR,即使你不懂深度学习,也能轻松上手!
效果展示
通用文字识别

手写字识别

票据识别

多角度文本识别

2025年5月20日,飞桨团队发布了 PaddleOCR 3.0,SmartJavaAI 第一时间完成集成,现已支持最新的 PP-OCRv5 模型。
SmartJavaAI是什么?
SmartJavaAI是专为JAVA 开发者打造的一个功能丰富、开箱即用的 JAVA AI算法工具包,致力于帮助JAVA开发者零门槛使用各种AI算法模型,开发者无需深入了解底层实现,即可轻松在 Java 代码中调用人脸识别、目标检测、OCR 等功能。底层支持包括基于 DJL (Deep Java Library) 封装的深度学习模型,以及通过 JNI 接入的 C++/Python 算法,兼容多种主流深度学习框架如 PyTorch、TensorFlow、ONNX、Paddle 等,屏蔽复杂的模型部署与调用细节,开发者无需了解 AI 底层实现即可直接在 Java 项目中集成使用,后续将持续扩展更多算法,目标是构建一个“像 Hutool 一样简单易用”的 JAVA AI 通用工具箱
## 安装
1、环境要求
- Java 版本:JDK 8或更高版本
- 操作系统:Windows/Linux/MacOS
macos M系列芯片,目前不支持JDK8使用,最低请使用JDK11
2、Maven
在项目的 pom.xml 中添加以下依赖以及平台依赖库,详细引入方式参考 官方文档。如需引入全部功能,请使用 smartjavaai-all 模块。
<dependency> <groupId>cn.smartjavaai</groupId> <artifactId>smartjavaai-ocr</artifactId> <version>1.0.16</version></dependency>
3、模型介绍及下载
模型下载
文本检测模型
常规 / 高性能
常规 / 高性能
文本识别模型
常规 / 高性能
常规 / 高性能
文本方向分类模型(cls)
OCR文本检测
检测图像中的文本区域,仅返回文本框位置,不识别文字内容
获取OCR检测模型:
OcrDetModelConfig config = new OcrDetModelConfig();config.setModelEnum(CommonDetModelEnum.PADDLEOCR_V5_DET_MODEL);config.setDetModelPath(\"/PP-OCRv5_server_det_infer/PP-OCRv5_server_det.onnx\");OcrCommonDetModel model = OcrModelFactory.getInstance().getDetModel(config);
OcrDetModelConfig参数说明
模型必须位于单独文件夹中,否则可能导致加载失败。
文本检测方法
List<OcrBox> detect(String imagePath);List<OcrBox> detect(BufferedImage image);List<OcrBox> detect(byte[] imageData);
OcrBox字段说明
- 返回并非json格式,仅用于字段讲解
[ { \"topLeft\": { // 左上角坐标 \"x\": 838, \"y\": 1069 }, \"topRight\": { // 右上角坐标 \"x\": 1149, \"y\": 985 }, \"bottomRight\": { // 右下角坐标 \"x\": 1191, \"y\": 1142 }, \"bottomLeft\": { // 左下角坐标 \"x\": 880, \"y\": 1226 } }]
检测并绘制文本框
/** * 检测并绘制 * @param imagePath 图片输入路径(包含文件名称) * @param outputPath 图片输出路径(包含文件名称) */void detectAndDraw(String imagePath, String outputPath);/** * 检测并绘制 * @param sourceImage * @return */BufferedImage detectAndDraw(BufferedImage sourceImage);
OCR文本方向检测
- 检测每行文本的方向:支持返回四种可能的方向角度:0°, 90°, 180°, 270°,用于进一步识别处理。
- 检测流程:文本检测 -> 文本方向分类
获取OCR方向检测模型:
DirectionModelConfig directionModelConfig = new DirectionModelConfig();directionModelConfig.setDetModelEnum(CommonDetModelEnum.PADDLEOCR_V5_DET_MODEL);directionModelConfig.setDetModelPath(\"/PP-OCRv5_server_det_infer/PP-OCRv5_server_det.onnx\");directionModelConfig.setModelEnum(DirectionModelEnum.CH_PPOCR_MOBILE_V2_CLS);directionModelConfig.setModelPath(\"/cls/ch_ppocr_mobile_v2.0_cls.onnx\");OcrDirectionModel directionModel = OcrModelFactory.getInstance().getDirectionModel(directionModelConfig);
DirectionModelConfig参数说明
文本检测方法
List<OcrItem> detect(String imagePath);List<OcrItem> detect(BufferedImage image);List<OcrItem> detect(byte[] imageData);
OcrItem字段说明
- 返回并非json格式,仅用于字段讲解
[ { \"angle\": \"ANGLE_180\", // 角度 枚举:AngleEnum \"ocrBox\": { \"topLeft\": { // 左上角坐标 \"x\": 838, \"y\": 1069 }, \"topRight\": { // 右上角坐标 \"x\": 1149, \"y\": 985 }, \"bottomRight\": { // 右下角坐标 \"x\": 1191, \"y\": 1142 }, \"bottomLeft\": { // 左下角坐标 \"x\": 880, \"y\": 1226 } }, \"score\": 1 // 检测结果分数 }]
检测并绘制检测结果
/** * 检测并绘制 * @param imagePath 图片输入路径(包含文件名称) * @param outputPath 图片输出路径(包含文件名称) */void detectAndDraw(String imagePath, String outputPath);/** * 检测并绘制 * @param sourceImage * @return */BufferedImage detectAndDraw(BufferedImage sourceImage);
OCR文字识别
已集成PaddleOCR最新的-全场景文字识别模型PP-OCRv5:单模型支持五种文字类型和复杂手写体识别;整体识别精度相比上一代提升13个百分点。
支持简体中文、繁体中文、英文、日文四种主要语言,以及手写、竖版、拼音、生僻字
获取OCR文字识别模型:
OcrRecModelConfig recModelConfig = new OcrRecModelConfig();recModelConfig.setDetModelEnum(CommonDetModelEnum.PADDLEOCR_V5_DET_MODEL);recModelConfig.setDetModelPath(\"/PP-OCRv5_server_det_infer/PP-OCRv5_server_det.onnx\");recModelConfig.setRecModelEnum(CommonRecModelEnum.PADDLEOCR_V5_REC_MODEL);recModelConfig.setRecModelPath(\"/PP-OCRv5_server_rec_infer/PP-OCRv5_server_rec.onnx\");OcrCommonRecModel recModel = OcrModelFactory.getInstance().getRecModel(recModelConfig);
OcrRecModelConfig参数说明
文本识别方法
OcrInfo recognize(String imagePath);OcrInfo recognize(BufferedImage image);OcrInfo recognize(byte[] imageData);
OcrInfo字段说明
-
fullText:识别得到的完整文本。每一行为一段识别结果,以换行符 \\n 分隔;同一行中,多个检测框的文字以空格分隔。
-
lineList:按行组织的识别结果。每一行使用一个 List 表示,该列表包含该行中每个检测框对应的文字,便于结构化处理。
-
返回并非json格式,仅用于字段讲解
{ \"fullText\": \"没有吃饱只有一个 \\n烦恼 \\n\", \"lineList\": [ [ { \"ocrBox\": { // 左上角坐标 \"topLeft\": { \"x\": 123, \"y\": 605 }, \"topRight\": { // 右上角坐标 \"x\": 941, \"y\": 359 }, \"bottomRight\": { // 右下角坐标 \"x\": 977, \"y\": 481 }, \"bottomLeft\": { // 左下角坐标 \"x\": 161, \"y\": 727 } }, \"text\": \"没有吃饱只有一个\" // 文字 } ], [ { \"ocrBox\": { \"topLeft\": { \"x\": 123, \"y\": 605 }, \"topRight\": { \"x\": 941, \"y\": 359 }, \"bottomRight\": { \"x\": 977, \"y\": 481 }, \"bottomLeft\": { \"x\": 161, \"y\": 727 } }, \"text\": \"烦恼\" } ] ]}
识别并绘制识别结果
/** * 识别并绘制 * @param imagePath 图片输入路径(包含文件名称) * @param outputPath 图片输出路径(包含文件名称) */void recognizeAndDraw(String imagePath, String outputPath);/** * 识别并绘制 * @param sourceImage * @return */BufferedImage recognizeAndDraw(BufferedImage sourceImage);
完整示例代码
示例代码
开源项目地址
🔗 Gitee 项目地址:https://gitee.com/dengwenjie/SmartJavaAI
🔗 GitHub 项目地址:https://github.com/geekwenjie/SmartJavaAI
🔗 GitCode 项目地址:https://gitcode.com/geekwenjie/SmartJavaAI
📖 在线文档地址:http://doc.smartjavaai.cn