# 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);

# 完整示例代码

示例代码 (opens new window)

# 离线使用

离线使用请看文档