# OCR文字识别
# 简介
OCR(Optical Character Recognition,光学字符识别)是一种将图像中的文字内容自动识别并转换为可编辑、可搜索文本的技术。它广泛应用于文档数字化、票据识别、身份证扫描、车牌识别等场景。
OCR 的核心流程通常包括以下几个步骤:
图像预处理:对输入图像进行灰度化、去噪、二值化等处理,提高识别准确率。
文本检测:定位图像中出现文字的位置(即检测出文字框)。
方向分类:判断文字方向,确保后续识别按正确的方向进行(如是否旋转了90°)。
文字识别:将检测到的文字区域逐个识别为具体的字符或字符串。
后处理:对识别结果进行排序、去噪、拼接或结构化处理,提升可读性和准确性。
现代 OCR 系统往往结合深度学习算法(如 CRNN、Transformer、PP-OCR 等),在复杂场景下依然能保持较高的准确率,甚至能识别手写体、多语言、竖排文本等。
通用文字识别 | ![]() |
手写字识别 | ![]() |
票据识别 | ![]() |
多角度文本识别 | ![]() |
# 安装
# 1、环境要求
- Java 版本:JDK 8或更高版本
- 操作系统:Windows/Linux/MacOS
注意事项:
macos M系列芯片,目前不支持JDK8使用,最低请使用JDK11
# 2、Maven
在项目的 pom.xml 中添加以下依赖以及平台依赖库,详细引入方式参考 Maven 引入。如需引入全部功能,请使用 smartjavaai-all 模块。
<dependency>
<groupId>cn.smartjavaai</groupId>
<artifactId>smartjavaai-ocr</artifactId>
<version>1.0.16</version>
</dependency>
# 3、模型介绍及下载
# 文本检测模型
全部下载链接: https://pan.baidu.com/s/1tczxpxkdL_7h9WDT77RWCA?pwd=1234 提取码: 1234
模型名称 | 检测 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<OcrItem>
表示,该列表包含该行中每个检测框对应的文字,便于结构化处理。返回并非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);