Java 实现 图片OCR文字识别

2023-05-16

Java 实现图片OCR文字识别功能

前言:

由于网上很多算法, 以及语言库无法做到精准识别, 所以综合条件下 使用了一款 space OCR API 的产品进行使用, 每个月有25000条的 使用额度, 日常使用或开发绰绰有余

网址链接


一. 注册 API 秘钥

1. 进入网址点击下面的注册链接输入自己的邮箱以及开发用途就会收到一个秘钥
image-20210927110736558
2. 注册好的API如下
image-20210927111035189

二. API解析

1. 上传方式选择

通过阅读API 文档我们可以得知, 发送图片解析的方式有三种:

  1. ) URL 上传, 前提是需要将图片放到公网可以访问到的位置
  2. ) File 上传, 通过Post 请求将图片放到from-data中发送
  3. ) base64编码上传 [推荐~]
2. 识别引擎选择

OCR 引擎 1 的特点:

  • - 支持更多语言(包括中文、日文和韩文等亚洲语言)
  • - 快点
  • - 支持更大的图像
  • - 多页 TIFF 扫描支持
  • - 参数:OCREngine=1

OCR 引擎 2 的特点:

  • -仅限西方拉丁字符语言(英语、德语、法语…)
  • - 语言自动检测。选择哪种 OCR 语言并不重要,只要它使用拉丁字符即可
  • - 通常在单个数字 OCR、单个字符 OCR 和字母数字 OCR 方面表现更好(例如SUDOKO、 点阵 OCR、 MRZ OCR、 单个数字 OCR、OCR后 缺少第一个字母,…)
  • - 通常更擅长特殊字符 OCR,如@±…
  • - 通常使用旋转文本效果更好(论坛:检测垃圾图片)
  • - 图像大小限制为 5000 像素宽度和 5000 像素高度
  • - 参数:OCREngine=2
3. 传参选择

在请求过程中只有两个参数是必填的, 分别是 apikey和 三种上传方式的一种

  1. ) language 在识别中文时可以选择 chs(简体), cht(繁体) 两种, 不识别中文可以选择引擎二 并且不用填写该参数
  2. ) filetype 填写该参数可以有效的增加识别精度
  3. ) scale 如果设置为 true,api 会进行一些内部升级。这可以显着改善 OCR 结果,尤其是对于低分辨率 PDF 扫描。 API 默认使用 scale=false
4. 请求参数解析
apikeyAPI 密钥
urlfilebase64Imageurl:远程图像文件的 URL(确保它具有正确的内容类型) file:具有文件名的多部分编码图像文件 base64Image:图像或 PDF 作为Base64 编码字符串您可以使用三种方法上传输入图像或 PDF。对于大于 10 MB 的文件,我们建议使用 URL 方法以提高上传速度。
language[可选] 阿拉伯语=ara 保加利亚语=bul 中文(简体)=chs 中文(繁体)=cht 克罗地亚语=hrv 捷克语=cze 丹麦语=dan 荷兰语=dut 英语=eng 芬兰语=fin 法语=fre 德语=ger 希腊语=gre 匈牙利语=hun 韩语=kor 意大利语=ita 日语=jpn 波兰语=pol 葡萄牙语=por 俄语=rus 斯洛文尼亚语=slv 西班牙语=spa 瑞典语=swe 土耳其语 = tur用于 OCR 的语言。如果未指定语言,eng则默认使用英语。 重要提示:语言代码总是3-letters(不是 2)。所以它是“eng”而不是“en”。 Engine2具有自动西文检测功能,因此该值将被忽略。
isOverlayRequired[可选] 布尔值默认值 =False 如果为 true,则返回每个单词的边界框坐标。如果为 false,则 OCR 处理的文本仅作为文本块返回(这会使 JSON 响应变小)。例如,覆盖数据可用于在图像上显示文本。
filetype[可选] 字符串值:PDF、GIF、PNG、JPG、TIF、BMP覆盖基于content-type的自动文件类型检测。支持的图像文件格式有 png、jpg (jpeg)、gif、tif (tiff) 和 bmp。对于文档 ocr,api 支持 Adobe PDF 格式。支持多页 TIFF 文件。
detectOrientation[可选] 真/假如果设置为 true,api 会正确自动旋转图像并TextOrientation在 JSON 响应中设置参数。如果图像旋转,则TextOrientation=0,否则为旋转度数,例如“270”。
isCreateSearchablePdf[可选] 布尔值默认值 =False 如果为 true,API 会生成可搜索的 PDF。此参数自动设置 isOverlayRequired = true。
isSearchablePdfHideTextLayer[可选] 布尔值默认值 = False。如果为 true,则隐藏文本层(不可见)
scale[可选] 真/假如果设置为 true,api 会进行一些内部升级。这可以显着改善 OCR 结果,尤其是对于低分辨率 PDF 扫描。请注意, API 默认使用 scale=false
isTable[可选] 真/假如果设置为 true,则 OCR 逻辑确保始终逐行返回解析的文本结果。建议将此开关用于 表格 OCR、收据 OCR、发票处理和所有其他类型的具有表格结构的输入文档。
OCREngine[可选] 1 或 2引擎 1 是默认值

三. 编写代码解析图片

public static void main(String[] args) {
        HashMap<String,Object> map = new HashMap<>();
        String imgStr = "data:image/jpg;base64,"+getImgStr("G:/2021-09-24/c8dc889efdb06f4f3860e2cd8ff1750.jpg");
        map.put("apikey","your keys");
        //map.put("url","https://gitee.com/Jarvis_D/typora-images/raw/master/img/0f08de942bb82ff8675f790b9b0a74a.png");
        map.put("base64Image",imgStr);
        //map.put("language","chs");
        map.put("filetype","JPG");
        map.put("OCREngine",2);
        //map.put("scale",true);
        String yy = HttpUtil.post("https://api.ocr.space/parse/image",map);
        //String yy = HttpUtils.doPostToJson("https://api.ocr.space/parse/image", JSON.toJSONString(map));
        JsonRootBean jsonRootBean = JSON.parseObject(yy, JsonRootBean.class);
        System.err.println(jsonRootBean.getParsedResults().get(0).getParsedText());
    }

    /**
     * 将图片转换成Base64编码
     * @param imgFile 待处理图片
     * @return
     */
    public static String getImgStr(String imgFile) {
        InputStream in = null;
        byte[] data = null;
        try {
            // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encodeBase64String(data);
    }

四. 返回结果的解析

1. 返回格式
{
        "ParsedResults" : [
            {
                "TextOverlay" : {
                    "Lines" : [
                        {
                            "Words": [
                                {
                                "WordText": "Word 1",
                                "Left": 106,
                                "Top": 91,
                                "Height": 9,
                                "Width": 11
                                },
                                {
                                "WordText": "Word 2",
                                "Left": 121,
                                "Top": 90,
                                "Height": 13,
                                "Width": 51
                                }
                            ],
                            "MaxHeight": 13,
                            "MinTop": 90
                        }
                    ],
                "HasOverlay" : true,
                "Message" : null
                },
                "FileParseExitCode" : "1",
                "ParsedText" : "This is a sample parsed result",
                                        
                "ErrorMessage" : null,
                "ErrorDetails" : null
            },
            {
                "TextOverlay" : null,
                "FileParseExitCode" : -10,
                "ParsedText" : null,
                                        
                "ErrorMessage" : "...error message (if any)",
                "ErrorDetails" : "...detailed error message (if any)"
            }
            ],
        "OCRExitCode" : "2",
        "IsErroredOnProcessing" : false,
        "ErrorMessage" : null,
        "ErrorDetails" : null,
        "SearchablePDFURL": "https://.....",
        "ProcessingTimeInMilliseconds" : "3000"
    }

2. 返回参数解析
ParsedResultsOCR结果图像或 PDF 每一页的 OCR 结果。对于 PDF:每个页面都有自己的 OCR 结果和错误消息(如果有)
OCRExitCode整数退出代码显示 OCR 是否成功完成、部分或失败并出现错误 1:解析成功(图像/所有页面解析成功) 2:部分解析(所有页面中只有几页成功解析) 3:图像/所有 PDF 页面解析失败(这主要发生因为 OCR 引擎无法解析图像) 4:尝试解析时发生错误(在解析过程中发生致命错误时会发生这种情况)
IsErroredOnProcessing真假如果在解析 Image/PDF 页面时发生错误
ErrorMessage文本解析图片时出现错误的报错信息
ErrorDetails文本详细的错误信息
SearchablePDFURL关联查看可搜索的 PDF
图像/页面解析结果
FileParseExitCode每个解析结果的退出代码解析引擎返回的退出代码 0:File not found 1:Success -10:OCR Engine Parse Error -20:Timeout -30:Validation Error -99:Unknown Error
ParsedText解析文本图像的解析文本
TextOverlay图像/pdf 中文本的覆盖数据仅当 ‘isOverlayRequired’ 设置为 ‘True’
Lines覆盖文本中的行数组这包含所有行的数组。每行将包含一个单词数组
Words一行中的一组单词这包含具有单词特定细节的单词,例如其文本和位置
WordText文字的文字这包含该特定单词的文本
Left单词与左侧的距离(以像素 (px) 为单位)包含单词与图像左边缘的距离(以 px 为单位)
Top单词与顶部的距离(以 px 为单位)包含单词与图像上边缘的距离(以 px 为单位)
Height字的高度包含单词的高度(以像素为单位)
Width字宽包含单词的宽度(以像素为单位)
MaxHeight线的最大高度包含线的高度(以像素为单位)
MinTop线距图像上边缘的最小距离包含图像原始大小中线距顶部边缘的距离(以 px 为单位)
HasOverlay叠加层是否存在真/假取决于解析结果的覆盖是否存在
ErrorMessage文本解析引擎返回的错误信息
ErrorDetails文本解析引擎返回的用于调试的详细错误信息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 实现 图片OCR文字识别 的相关文章

随机推荐

  • ROS创建工作空间及功能包流程总结整理(python)

    ROS创建工作空间及功能包流程总结整理 xff08 python xff09 参考资料 xff1a B站赵虚左 xff1a https www bilibili com video BV1Ci4y1L7ZZ p 61 19 amp vd s
  • ROS自定义发布消息类型

    ROS自定义发布消息类型 xff1a 在 ROS 通信协议中 xff0c 数据载体是一个较为重要组成部分 xff0c 在上一案例中 xff0c ROS 中通过 std msgs 封装了一些原生的数据类型 比如 String Int32 In
  • ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

    ROS服务通信具体实现流程 demo xff1a 实现两个整型数相加求和 xff0c 客户端发送两个整型数 xff0c 服务端对其求和 服务通信也需要自定义服务数据类型 xff0c 即自定义srv文件 xff0c 该过程和自定义msg文件非
  • ROS TF静态坐标变换实现

    ROS TF静态坐标变换实现 法一 xff1a 编码实现 发布方代码实现 xff1a 创建功能包并添加依赖 catkin create pkg tf static roscpp rospy std msgs tf2 tf2 ros tf2
  • ROS:Gazebo导入自定义环境

    Gazebo导入自定义环境 之前的案例gazebo中导入的是一个空世界empty world xff0c 这里会介绍如何导入房屋数目等自定义的环境 xff08 1 xff09 启动 gazebo 打开构建面板 xff0c 绘制仿真环境 xf
  • ROS导航实现:SLAM建图(slam_gmapping)与保存(map_server)

    导航实现 xff1a SLAM建图 先安装相关的ROS功能包 安装 gmapping 包 用于构建地图 sudo apt install ros lt ROS版本 gt gmapping 安装地图服务包 用于保存与读取地图 sudo apt
  • ROS导航实现:amcl定位

    ROS导航实现 xff1a amcl定位 xff08 1 xff09 首先编写启动amcl的launch文件 xff0c 这里建议复制粘贴模板 xff0c 再修改相关的参数即可 xff0c 步骤如下 xff1a 主目录下进入amcl文件 r
  • ROS导航实现之路径规划

    导航实现之路径规划 move base 功能包提供了基于动作 action 的路径规划实现 xff0c move base 可以根据给定的目标点 xff0c 控制机器人底盘运动至目标位置 xff0c 并且在运动过程中会连续反馈机器人自身的姿
  • 创建个人网站(github pages)并将站点一键托管到Github

    创建个人网站 xff08 github pages xff09 并将站点一键托管到Github 内容 xff1a 使用网站生成器mkdocs将markdown文件生成wiki站点并挂载到github的流程总结 亮点 xff1a 个人网站一键
  • 视觉SLAM十四讲(第2版)总结

    最近看完了 视觉SLAM十四讲 xff08 第2版 xff09 xff1a 从理论到实践 xff08 高翔等著 xff09 xff0c 原书分两部分 xff0c 先介绍了数学基础 xff0c 然后介绍了具体的SLAM实践 xff0c 非常适
  • 我的公众号 - 豆芽儿 软件研发人才生长社区

    为你系统分享敏捷开发 项目管理 需求分析 软件设计 UML 中层领导力 CMMI IT职场 ACP 软考 PMP等 高大上 的实用知识 xff0c 帮助你进阶为高端人才 xff01
  • Openblas 下载和使用方法

    Openblas 下载及使用 环境 xff1a 平台 xff1a Ubuntu 20 04 xff0c Orin xff1a Arm Cortex A78AE v8 2 64 bit 步骤 xff1a 1 去github 下载openbla
  • FreeRTOS学习记录

    FreeRTOS学习记录 前言FreeRTOS学习记录在STM32CubeMX中配置FreeRTOS 前言 本人小白 xff0c 最近学习了FreeRTOS操作系统 xff0c 打算做一点记录 学习的过程中虽然做了点练习 xff0c 不过都
  • 如何给华三交换机恢复出厂设置及命令

    如何给华三交换机恢复出厂设置及命令 在前几天 xff0c 上级单位线路重新规划 xff0c 需要我们将单位的线路进行改造 xff0c 这就涉及到了网络设备的重新配置 经查看 xff0c 上级接入交换机的业务端口配置为access xff0c
  • 解决Linux下Docker下载安装太慢

    卸载先前版本 yum remove docker docker span class token operator span client docker span class token operator span client span
  • sqlyong连接docker中的mysql 失败can‘t connect to MySQL server on (*******:3306)

    解决sqlyong连接docker中myslq失败 xff1a 一 查看mysql是否运行docker ps 二 查看mysql端口映射是否与连接相符 三 进入mysql容器查看是否能够进行本地连接docker exec it mysql
  • 解决springboot+webSocket出现404错误

    这是因为websocket创建的bean是由自己来管理的 需要将其创建的bean交给spring管理 创建websocketconfig span class token keyword package span com span clas
  • Bytebuffer源码剖析及实现原理

    Bytebuffer 官方解释A byte buffer xff0c 一个字节缓冲区 一 使用方法 ByteBuffer 初始状态是写模式 使用IO流即可写入数据 如 channel read 如果需要读取ByteBuffer中的数据调用f
  • Linux下安装并配置FTP文件服务器

    一 安装vsftpd 1 运行如下代码安装vsftpd yum install span class token operator span y vsftpd 2 运行以下命令设置FTP服务开机自启动 systemctl enable vs
  • Java 实现 图片OCR文字识别

    Java 实现图片OCR文字识别功能 前言 由于网上很多算法 以及语言库无法做到精准识别 所以综合条件下 使用了一款 space OCR API 的产品进行使用 每个月有25000条的 使用额度 日常使用或开发绰绰有余 网址链接 一 注册