java版的ocr推荐引擎——JiaJiaOCR 2.0重磅升级!纯Java CPU推理,新增手写OCR与表格识别

在OCR技术落地过程中,Java开发者常面临"Python生态繁荣,Java集成困难"的困境------要么依赖exe/dll外部文件,要么跨平台部署踩坑不断。如今,JiaJiaOCR 2.0重磅升级,不仅延续CPU推理优势,更新增手写OCR、版面检测、表格检测与识别三大核心功能,模型加载方式也全面优化,实用性再上一个台阶!

一、2.0版本核心升级亮点

相较于1.0版本,JiaJiaOCR 2.0在功能、性能、易用性上实现三重突破,直击更多实际业务场景需求:

  1. 功能扩容:从"通用"到"全能":在原通用文本识别基础上,新增手写OCR、版面检测、表格检测与识别功能,覆盖印刷体、手写体、文档结构解析全场景;

  2. 性能优化:模型懒加载更高效:采用功能按需加载模型的懒加载机制,初始化时无需加载所有模型,降低内存占用,启动速度提升40%;

  3. 体验升级:结果输出更丰富:除原有文本内容与坐标外,新增版面元素坐标、表格识别HTML格式输出,直接支持结构化数据提取;

  4. 兼容性不变:跨平台无依赖:全程纯Java实现,无需调用exe/dll,完美兼容Windows、Linux x86环境,JDK8+即可运行。

二、四大核心功能详解

JiaJiaOCR 2.0以"全场景文本解析"为核心,四大功能覆盖从单字识别到文档结构化的完整需求:

1. 通用OCR:印刷体识别标杆

延续1.0版本的高精度印刷体识别能力,支持中英文、数字、符号混合识别,返回文本内容与坐标,适用于发票、标签、广告牌等印刷体场景。

2. 手写OCR:突破手写识别难点

新增针对中文手写体的专项优化模型,支持工整手写、连笔手写等常见手写风格,解决手写笔记数字化、手写表单录入等痛点,识别准确率达92%以上(标准手写样本测试)。

3. 版面检测:文档结构智能解析

可自动识别文档中的标题、段落、图片、表格等版面元素,返回各元素的坐标与类型标签,为文档结构化处理提供基础,适用于PDF转Word、古籍数字化等场景。

4. 表格检测与识别:结构化数据直接提取

业内少有的纯Java表格识别方案,支持表格区域检测、单元格分割、内容识别全流程,最终输出HTML格式的结构化结果,可直接渲染为表格或导入Excel,彻底告别手动录入表格数据的繁琐。

三、快速上手:5分钟集成教程

1. 环境准备

  • 开发环境:JDK 8及以上版本;

  • 运行环境:Windows 10+、Linux x86_64;

  • 依赖:Maven(推荐)。

2. 引入依赖与Jar包

第一步:在pom.xml中添加以下依赖(深度学习引擎与图像处理依赖):

java 复制代码
<dependencies>
    <!-- ONNX Runtime:模型推理核心依赖 -->
    <dependency>
        <groupId>com.microsoft.onnxruntime</groupId>
        <artifactId>onnxruntime</artifactId>
        <version>1.19.0</version>
    </dependency>
    <!-- DJL MXNet引擎:深度学习框架支持 -->
    <dependency>
        <groupId>ai.djl.mxnet</groupId>
        <artifactId>mxnet-engine</artifactId>
        <version>0.31.0</version>
    </dependency>
    <!-- OpenCV:图像处理依赖 -->
    <dependency>
        <groupId>ai.djl.opencv</groupId>
        <artifactId>opencv</artifactId>
        <version>0.31.0</version>
    </dependency>
    <!-- DJL核心API:模型管理 -->
    <dependency>
        <groupId>ai.djl</groupId>
        <artifactId>api</artifactId>
        <version>0.31.0</version>
    </dependency>
</dependencies>

第二步:下载核心Jar包:

前往GitHub仓库https://github.com/jiangnanboy/JiaJiaOCR的`releases`页面,下载**JiaJiaOCR 2.0**版本的jar包,放入项目依赖目录并引入,这个Jar包200MB,因为集成了模型。

3. 完整功能示例代码

以下代码包含2.0版本所有核心功能的调用示例,注释清晰可直接复制使用,需将imgPath替换为实际图片路径:

java 复制代码
import com.jiajia.common_object.*;
import com.jiajia.core.JiaJiaOCR;
import org.apache.commons.lang3.tuple.Pair;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;

public class JiaJiaOCR2Demo {
    public static void main(String...args) {
        String imgPath = "test.jpg"; // 替换为你的图片路径

        // 按需解锁功能(注释解开即可使用)
        // generalOCRTest(imgPath);    // 1.通用OCR(印刷体)
        // handwrittingOCRTest(imgPath); // 2.手写OCR
        // layoutDetTest(imgPath);     // 3.版面检测(带可视化)
        // tableDetTest(imgPath);      // 4.表格检测(带可视化)
        // tableRecTest(imgPath);      // 5.表格识别(输出HTML)
        // tableDetRecTest(imgPath);   // 6.表格检测+识别(一站式)
        // textLineDetText(imgPath);   // 7.文本行检测(带可视化)
    }
    /**
     * 1. 通用OCR(印刷体识别)
     * @param imgPath 图片路径
     */
    public static void generalOCRTest(String imgPath) {
        // 懒加载初始化:此时不加载任何模型
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        // 调用功能时才加载对应模型
        List<Pair<Text, Box>> result = jiaJiaOCR.recognizeGeneralText(imgPath);
        // 输出:文本内容+四边形坐标
        System.out.println("通用OCR结果:" + result);
    }
    /**
     * 2. 手写OCR识别
     * @param imgPath 图片路径
     */
    public static void handwrittingOCRTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<Pair<Text, Box>> result = jiaJiaOCR.recognizeHandwrittenText(imgPath);
        System.out.println("手写OCR结果:" + result);
    }
    /**
     * 3. 版面检测(识别标题/段落/表格等元素,带可视化)
     * @param imgPath 图片路径
     */
    public static void layoutDetTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<Layout> layoutList = jiaJiaOCR.detectLayout(imgPath);
        // 可视化检测结果并保存
        Mat img = Imgcodecs.imread(imgPath);
        drawLayoutPredictions(img, layoutList);
        Imgcodecs.imwrite("layout_result.jpg", img);
        System.out.println("版面检测结果已保存,元素信息:" + layoutList);
    }
    /**
     * 4. 表格检测(仅检测表格区域,带可视化)
     * @param imgPath 图片路径
     */
    public static void tableDetTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<DetectionResult> tableList = jiaJiaOCR.detectTables(imgPath);
        // 可视化表格区域
        Mat img = Imgcodecs.imread(imgPath);
        Mat resultMat = drawTableResults(img, tableList);
        Imgcodecs.imwrite("table_detect_result.jpg", resultMat);
        System.out.println("表格检测区域:" + tableList);
    }
    /**
     * 5. 表格识别(基于通用OCR结果提取表格结构,输出HTML)
     * @param imgPath 图片路径
     */
    public static void tableRecTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        // 先获取通用OCR结果
        List<Pair<Text, Box>> ocrResult = jiaJiaOCR.recognizeGeneralText(imgPath);
        // 基于OCR结果提取表格结构
        TableResult tableResult = jiaJiaOCR.recognizeTableFromOCR(imgPath, ocrResult);
        // 输出HTML格式(可直接渲染)
        System.out.println("表格识别HTML结果:" + tableResult.getHtmlContent());
    }
    /**
     * 6. 表格检测+识别一站式调用
     * @param imgPath 图片路径
     */
    public static void tableDetRecTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        // 一步获取表格结构化结果
        List<TableResult> tableResults = jiaJiaOCR.recognizeTables(imgPath);
        for (TableResult table : tableResults) {
            System.out.println("表格HTML:" + table.getHtmlContent());
            System.out.println("表格坐标:" + table.getBox());
        }
    }
    /**
     * 7. 文本行检测(带可视化)
     * @param imgPath 图片路径
     */
    public static void textLineDetText(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        Boxes textLines = jiaJiaOCR.detectTextLines(imgPath);
        // 可视化文本行
        Mat img = Imgcodecs.imread(imgPath);
        drawTextLinePredictions(img, textLines);
        Imgcodecs.imwrite("textline_result.jpg", img);
        System.out.println("文本行检测结果:" + textLines);
    }
    // ------------------- 可视化工具方法 -------------------
    /**
     * 绘制版面检测结果
     */
    public static void drawLayoutPredictions(Mat img, List<Layout> detLayout) {
        for(Layout layout : detLayout) {
            int[] bbox = layout.getBbox();
            // 绘制矩形框(红色,线宽2)
            Imgproc.rectangle(img, new Point(bbox[0], bbox[1]), 
                             new Point(bbox[2], bbox[3]), new Scalar(0, 0, 255), 2);
            // 绘制元素标签(绿色文字)
            String label = layout.getLabel();
            Imgproc.putText(img, label, new Point(bbox[0]+5, bbox[1]-10), 
                           Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(0, 255, 0), 2);
        }
    }
    /**
     * 绘制表格检测结果
     */
    public static Mat drawTableResults(Mat image, List<DetectionResult> results) {
        Mat resultImg = image.clone();
        for (DetectionResult result : results) {
            String label = "表格:" + String.format("%.2f", result.getConfidence());
            // 绘制标签与矩形框
            Imgproc.putText(resultImg, label, new Point(result.getRect().x, result.getRect().y-10),
                           Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(0, 0, 255), 2);
            Imgproc.rectangle(resultImg, new Point(result.getRect().x, result.getRect().y),
                           new Point(result.getRect().x+result.getRect().width, 
                                     result.getRect().y+result.getRect().height),
                           new Scalar(0, 0, 255), 2);
        }
        return resultImg;
    }
    /**
     * 绘制文本行检测结果(多边形适配任意角度)
     */
    public static void drawTextLinePredictions(Mat img, Boxes detBoxes) {
        List<Box> boxList = detBoxes.getBoxes();
        for(Box box : boxList) {
            double[] pos = box.getLinePosition();
            // 构建四边形顶点
            Point[] points = new Point[4];
            points[0] = new Point(pos[0], pos[1]);
            points[1] = new Point(pos[2], pos[3]);
            points[2] = new Point(pos[4], pos[5]);
            points[3] = new Point(pos[6], pos[7]);
            // 绘制多边形(红色,线宽1)
            MatOfPoint polygon = new MatOfPoint(points);
            List<MatOfPoint> polygons = new ArrayList<>();
            polygons.add(polygon);
            Imgproc.polylines(img, polygons, true, new Scalar(0, 0, 255), 1);
        }
    }
}

四、关键返回结果说明

JiaJiaOCR 2.0提供结构化、易解析的返回结果,覆盖不同功能场景需求:

功能模块 核心返回内容 数据格式说明
通用OCR/手写OCR 文本内容、坐标、置信度 List<Pair<Text, Box>>,Text含内容与置信度,Box含8个顶点坐标
版面检测 元素类型、坐标、置信度 List<Layout>,含label(标题/段落等)、bbox(矩形坐标)
表格检测 表格区域、置信度 List<DetectionResult>,含矩形坐标与置信度
表格识别 表格结构、内容、坐标 TableResult,含htmlContent(HTML格式)、box(坐标)

五、典型应用场景

凭借全功能覆盖与纯Java优势,JiaJiaOCR 2.0可广泛落地于以下场景:

  • 企业文档管理系统:结合版面检测与OCR,实现合同、报表的结构化解析与检索;

  • 教育信息化平台:通过手写OCR识别学生作业、试卷中的手写答案,辅助自动批改;

  • 金融票据处理:识别发票、单据中的印刷体内容与表格数据,自动录入财务系统;

  • 政务办公系统:解析各类政务表单的版面结构与填写内容,实现无纸化办公;

  • 工业质检场景:识别生产线上产品标签的印刷体文字,实现质量追溯。

六、获取与交流方式

JiaJiaOCR开源库免费使用,欢迎Java开发者体验与反馈问题:

写在最后

JiaJiaOCR 2.0的升级核心,是从"解决Java开发者OCR集成痛点"到"提供全场景文本解析能力"的跨越。纯Java实现保障了跨平台部署的便捷性,新增的手写OCR与表格识别功能则直击实际业务中的高频需求。

如果你正在为Java项目寻找轻量、高效、无依赖的OCR解决方案,不妨试试JiaJiaOCR 2.0------5分钟集成,一站式覆盖从印刷体到手写体、从文本识别到表格结构化的全需求。期待你的使用反馈,也欢迎一起讨论,让Java OCR生态更加强大!

温馨提示:首次使用建议先运行示例代码,确认依赖与Jar包引入正确;如有问题请联系我。

相关推荐
时光轻浅,半夏挽歌2 小时前
python不同格式文件的读写方式(json等)
python·json
鸽鸽程序猿3 小时前
【项目】【抽奖系统】抽奖
java·spring
测试人社区-千羽3 小时前
边缘计算场景下的智能测试挑战
人工智能·python·安全·开源·智能合约·边缘计算·分布式账本
抽象带篮子3 小时前
Pytorch Lightning 框架运行顺序
人工智能·pytorch·python
哇哈哈&3 小时前
安装wxWidgets3.2.0(编译高版本erlang的时候用,不如用rpm包),而且还需要高版本的gcc++19以上,已基本舍弃
linux·数据库·python
GoogleDocs3 小时前
基于[api-football]数据学习示例
java·学习
卓码软件测评3 小时前
第三方软件验收评测机构【Gatling安装指南:Java环境配置和IDE插件安装】
java·开发语言·ide·测试工具·负载均衡
妮妮分享3 小时前
H5获取定位的方式是什么?
java·前端·javascript
Billow_lamb4 小时前
MyBatis-Plus 的 条件构造器详解(超详细版)
java·mybatis