> 技术文档 > 工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案_java最强的ocr识别

工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案_java最强的ocr识别


简介

OCR(Optical Character Recognition,光学字符识别)是一种将图像中的文字内容自动识别并转换为可编辑、可搜索文本的技术。它广泛应用于文档数字化、票据识别、身份证扫描、车牌识别等场景。

OCR 的核心流程通常包括以下几个步骤:

  • 图像预处理:对输入图像进行灰度化、去噪、二值化等处理,提高识别准确率。

  • 文本检测:定位图像中出现文字的位置(即检测出文字框)。

  • 方向分类:判断文字方向,确保后续识别按正确的方向进行(如是否旋转了90°)。

  • 字识别:将检测到的文字区域逐个识别为具体的字符或字符串。

  • 后处理:对识别结果进行排序、去噪、拼接或结构化处理,提升可读性和准确性。

现代 OCR 系统往往结合深度学习算法(如 CRNN、Transformer、PP-OCR 等),在复杂场景下依然能保持较高的准确率,甚至能识别手写体、多语言、竖排文本等。

本篇文章将手把手教你如何使用 SmartJavaAI 实现 OCR,即使你不懂深度学习,也能轻松上手!

效果展示

通用文字识别

工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案_java最强的ocr识别

手写字识别

票据识别

工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案_java最强的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、模型介绍及下载

模型下载

文本检测模型
模型名称 检测 Hmean (%) GPU 推理耗时(ms)
常规 / 高性能 CPU 推理耗时(ms)
常规 / 高性能 模型大小 (MB) 介绍 PP-OCRv5_server_det 83.8 89.55 / 70.19 371.65 / 371.65 84.3 PP-OCRv5 的服务端文本检测模型,精度更高,适合在性能较好的服务器上部署
文本识别模型
模型名称 Avg Accuracy (%) GPU 推理耗时(ms)
常规 / 高性能 CPU 推理耗时(ms)
常规 / 高性能 模型大小 (MB) 介绍 PP-OCRv5_server_rec 86.38 8.45 / 2.36 122.69 / 122.69 81 PP-OCRv5_rec 是新一代文本识别模型。该模型致力于以单一模型高效、精准地支持简体中文、繁体中文、英文、日文四种主要语言,以及手写、竖版、拼音、生僻字等复杂文本场景的识别。在保持识别效果的同时,兼顾推理速度和模型鲁棒性,为各种场景下的文档理解提供高效、精准的技术支撑。
文本方向分类模型(cls)
模型名称 模型大小 (MB) 介绍 ch_ppocr_mobile_v2.0_cls < 1 原始分类器模型,对检测到的文本行文字角度分类

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参数说明

字段名称 字段类型 必选 默认值 说明 modelEnum CommonDetModelEnum 是 无 OCR文本检测模型枚举 detModelPath String 是 无 检测模型路径,需手动指定 device DeviceEnum 否 CPU 指定运行设备,支持 CPU/GPU

模型必须位于单独文件夹中,否则可能导致加载失败。

文本检测方法

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参数说明

字段名称 字段类型 必选 默认值 说明 modelEnum DirectionModelEnum 是 无 文本方向模型枚举 modelPath String 是 无 文本方向检测模型路径,需手动指定 detModelEnum CommonDetModelEnum 是 无 文本检测模型枚举 detModelPath String 是 无 检测模型路径,需手动指定 device DeviceEnum 否 CPU 指定运行设备,支持 CPU/GPU

文本检测方法

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参数说明

字段名称 字段类型 必选 默认值 说明 detModelEnum CommonDetModelEnum 是 无 文本检测模型枚举 detModelPath String 是 无 检测模型路径,需手动指定 recModelEnum CommonRecModelEnum 是 无 文本识别模型枚举 recModelPath String 是 无 文本识别模型路径,需手动指定 directionModelEnum DirectionModelEnum 是 无 文本方向模型枚举 directionModelPath String 是 无 文本方向检测模型路径,需手动指定 device DeviceEnum 否 CPU 指定运行设备,支持 CPU/GPU

文本识别方法

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