当前位置: 首页 > backend >正文

RapidOCR4j项目学习

https://rapidai.github.io/RapidOCRDocs/install_usage/api/RapidOCR/#_1

功能实现

  • 多平台OCR识别:支持 Windows、Linux、 macOS(包括 Intel 和 ARM 架构)
  • 多种图片输入方式:支持图片路径(Path)、BufferedImage、byte[]、OpenCV 的 Mat 四种输入类型
  • 模型推理:通过 ONNXRuntime 加载和推理 OCR 模型(检测 det.onnx、识别 rec.onnx、字典 txt)
  • 图片预处理与后处理:利用 OpenCV 对图片进行预处理(如缩放、灰度化等),并对模型输出做后处理(如文本框坐标、文本内容提取)
  • 可扩展性强:纯 Java 实现,便于二次开发和集成到其他 Java 项目中
  • 支持 CPU 和 GPU:默认 CPU 推理,可选用 onnxruntime_gpu 依赖支持 CUDA GPU

实现原理与底层逻辑

整体架构

核心流程:图片输入 → OpenCV 预处理 → ONNXRuntime 推理(检测+识别)→ 结果后处理 → 输出结构化文本结果

模块划分:

  • 配置模块(OcrConfig/ParamConfig):管理模型路径、参数等
  • 推理模块(RapidOCR):负责模型加载、推理和流程调度
  • 工具模块(OcrJsonConverter 等):结果格式化、辅助功能
关键技术点

ONNXRuntime 推理

  • 模型加载:通过 OcrConfig 配置 det.onnx(文本检测)、rec.onnx(文本识别)模型路径,以及字典文件路径
  • 推理过程:
    • 文本检测模型(det.onnx):定位图片中的文本区域,输出文本框坐标
    • 文本识别模型(rec.onnx):对检测到的文本区域进行识别,输出文本内容
    • 推理引擎:ONNXRuntime 支持跨平台和多种硬件(CPU/GPU),Java 通过 JNI 调用底层 C++ 实现

OpenCV 图像处理

  • 预处理:如图片缩放、灰度化、归一化等,提升模型识别准确率
  • 后处理:如文本框坐标变换、NMS(非极大值抑制)去重等

多输入类型适配
支持 Path、BufferedImage、byte[]、Mat 四种输入,内部统一转为 OpenCV Mat 进行处理,保证接口灵活性和兼容性

结果结构化
识别结果通过 OcrResult 封装,支持转为 JSON,便于前后端交互或二次处理

代码示例

// 通过图片路径识别
rapidOCR.run("src/test/resources/a.png");// 通过 BufferedImage 识别
rapidOCR.run(bufferedImage, paramConfig);// 通过字节流识别
rapidOCR.run(byte[]);// 通过 OpenCV Mat 识别
rapidOCR.run(mat);

与 README.md 的底层逻辑呼应

  • 配置灵活:通过 OcrConfig 可自定义模型路径、OpenCV 库路径等,适配不同平台和环境
  • 依赖管理:Maven 依赖简单,支持 CPU/GPU 切换,便于集成
  • 跨平台:底层依赖 ONNXRuntime 和 OpenCV,Java 层做了良好封装,保证了平台兼容性
  • 二次开发友好:纯 Java 代码,接口清晰,易于扩展和集成到其他系统

总结

RapidOCR4j 是一个高效、跨平台、易集成的 OCR 解决方案,底层基于 ONNXRuntime(模型推理)和 OpenCV(图像处理),通过 Java 封装实现了多输入类型适配和结构化输出,支持 CPU/GPU,适合在多种业务场景下进行文本识别任务。其架构设计注重灵活性和可扩展性,便于后续功能拓展和平台适配。

OcrConfig 结构与参数详解

OcrConfig 是 RapidOCR4j 的主配置类,分为四大部分:全局配置(Global)、检测模块(Det)、分类模块(Cls)、识别模块(Rec)。

GlobalConfig(全局配置)
参数名类型默认值作用说明
textScorefloat0.5文本置信度阈值,低于该值的文本框会被过滤掉。
useDetbooleantrue是否启用文本检测模块。
useClsbooleanfalse是否启用方向分类模块(如检测文本方向)。
useRecbooleantrue是否启用文本识别模块。
printVerbosebooleantrue是否打印详细日志,便于调试。
minHeightint30处理图片的最小高度,低于该值的图片会被缩放。
widthHeightRatiofloat8图片宽高比限制,防止极端长宽图片影响识别。
maxSideLenint2000图片最大边长,超出会缩放。
minSideLenint30图片最小边长,低于会缩放。
returnWordBoxbooleanfalse是否返回单词级别的文本框(否则返回行级别)。
intraOpNumThreadsint-1ONNX 单线程操作数,-1 表示默认。
interOpNumThreadsint-1ONNX 多线程操作数,-1 表示默认。
opencvLibPathStringnullOpenCV 动态库路径(dll/so),用于自定义 OpenCV 依赖。

说明:这些参数主要控制整体流程、图片预处理、日志输出和多线程性能调优。opencvLibPath 可用于适配不同平台的 OpenCV 动态库。

DetConfig(检测模块配置)
参数名类型默认值作用说明
intraOpNumThreadsint-1ONNX 单线程操作数。
interOpNumThreadsint-1ONNX 多线程操作数。
useCudabooleanfalse是否启用 CUDA(GPU)加速。
deviceIdint0GPU 设备编号。
useDmlbooleanfalse是否启用 DML(DirectML,Windows 下的 GPU 加速)。
modelPathStringmodels/ch_PP-OCRv4_det_infer.onnx检测模型路径。
limitSideLenint736输入图片边长限制,超出会缩放。
limitTypeString“min”边长限制类型(min/max)。
threshfloat0.3检测阈值,低于该值的候选框会被过滤。
boxThreshfloat0.5边框置信度阈值。
maxCandidatesint1000最大候选框数量。
unclipRatiofloat1.5NMS 后扩展比例,影响文本框大小。
useDilationbooleantrue是否使用膨胀操作,提升文本框闭合性。
scoreModeString“fast”评分模式(如 fast/normal,影响速度和精度)。
useArenabooleanfalse是否启用 arena 内存池(提升速度但增加内存占用)。

说明:这些参数主要影响文本检测的性能、精度和硬件加速方式。useArena 是底层 ONNX 的内存池策略,适合高性能场景但需注意内存占用。

ClsConfig(分类模块配置)
参数名类型默认值作用说明
intraOpNumThreadsint-1ONNX 单线程操作数。
interOpNumThreadsint-1ONNX 多线程操作数。
useCudabooleanfalse是否启用 CUDA。
deviceIdint0GPU 设备编号。
useDmlbooleanfalse是否启用 DML。
modelPathStringmodels/ch_ppocr_mobile_v2.0_cls_infer.onnx分类模型路径。
clsImageShapeint[]{3,48,192}分类输入图片形状(通道数、高、宽)。
clsBatchNumint1分类批处理数量。
clsThreshfloat0.9分类置信度阈值。
labelListString[]{“0”,“180”}分类标签(如 0: 正常,180: 旋转180°)。
useArenabooleanfalse是否启用 arena 内存池。

说明:主要用于文本方向分类,适合竖排/横排混合或有旋转文本的场景。clsImageShapeclsBatchNum 可调节性能和适配不同模型。

RecConfig(识别模块配置)
参数名类型默认值作用说明
intraOpNumThreadsint-1ONNX 单线程操作数。
interOpNumThreadsint-1ONNX 多线程操作数。
useCudabooleanfalse是否启用 CUDA。
deviceIdint0GPU 设备编号。
useDmlbooleanfalse是否启用 DML。
modelPathStringmodels/ch_PP-OCRv4_rec_infer.onnx识别模型路径。
recImgShapeint[]{3,48,320}识别输入图片形状(通道数、高、宽)。
recBatchNumint1识别批处理数量。
useArenabooleanfalse是否启用 arena 内存池。
recKeysPathStringnull字典路径(如不设置,默认从模型获取)。

说明:recImgShaperecBatchNum 可根据模型和硬件调整,recKeysPath 用于自定义字典(如支持不同语言/字符集)。

底层未暴露但可调节的参数
  • ONNXRuntime 线程数(intraOpNumThreads/interOpNumThreads):可根据服务器 CPU 核心数调优,提升并发性能。
  • Arena 内存池(useArena):适合高吞吐场景,但需监控内存占用。
  • DML 支持:Windows 下可用 DirectML 进行 GPU 加速,适合没有 CUDA 的机器。
  • OpenCV 动态库路径(opencvLibPath):可自定义 OpenCV 版本,适配不同平台或自编译库。
每个参数/代码的实际作用举例
config.getDet().setModelPath("models/det.onnx");
// 设置检测模型路径,决定用哪个 onnx 模型做文本检测。config.getRec().setRecKeysPath("xxx.txt");
// 设置识别字典路径,支持自定义字符集。config.getGlobal().setUseDet(false);
// 关闭文本检测,适合已知文本区域的场景。config.getRec().setUseCuda(true);
// 启用 GPU 加速,提升识别速度。
总结
  • OcrConfig 提供了极为丰富的参数,涵盖了模型路径、硬件加速、图片预处理、批处理、内存策略等各个方面。
  • 绝大多数参数都可以通过 OcrConfig 进行灵活配置,适配不同业务场景和硬件环境。
  • 还有部分底层参数如线程数、arena 内存池、DML 支持等,适合对性能有极致要求的场景。
  • 如需进一步了解每个参数的底层实现细节,可以继续查看各模块(如 TextDetectorTextRecognizerTextClassifier)的源码实现。
http://www.xdnf.cn/news/9367.html

相关文章:

  • 润和星闪WS63E的MQTT示例程序存在的潜在问题
  • 经典查找算法合集(下)
  • 行为型:命令模式
  • 多语言实现插值查找算法
  • 理解vue-cli中的webpack
  • Minktec 柔性弯曲传感器,灵敏捕捉坐姿弓背、精准监测行走姿态,守护儿童背部健康,为科学健身提供数据支撑,开启职业健康与背痛 AI 干预新方向。
  • vue + ant-design + xlsx 实现Excel多Sheet页导出功能
  • 如何通过ETL对WebService进行调用
  • 顶会新方向:卡尔曼滤波+目标检测
  • Java 程序求圆弧段的面积(Program to find area of a Circular Segment)
  • Mico 1.33.1 | 解锁高级版 上千种自定义组件 动态壁纸
  • Java String函数的使用
  • 016搜索之广度优先BFS——算法备赛
  • word中表格拉不动以及插入图片有间距
  • MySQL的参数 innodb_force_recovery 详解
  • vue3+element-plus el-date-picker日期、年份筛选设置本周、本月、近3年等快捷筛选
  • JavaEE初阶-网络编程
  • 使用Mathematica绘制随机多项式的根
  • OpenCV---findCountours
  • [java八股文][JavaSpring面试篇]SpringBoot
  • 前端Vue3列表滑动无限加载实现
  • 佰力博科技与您谈谈高温介电温谱仪如何保养
  • ROS2学习(15)------ROS2 TF2 机器人坐标系管理器
  • MySQL问题:MySQL中使用索引一定有效吗?如何排查索引效果
  • LeetCode-栈-最小栈
  • 现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践
  • UDP 传输时间(延迟)
  • 关于Oracle SGA内存抖动
  • FastAPI 异常处理
  • vscode ssh远程服务端设置