【方案三】JAVA中使用ocr(Umi-OCR)

embedded/2024/12/4 15:19:17/

目录

前言:

需求:

代码:

难点:

参考文档:


前言:

前两个方案都是自己做着玩儿的,实际运用到上线项目是要收费的,该方案使用的是免费开源的工具,就算运用到商业项目也不会侵权,建议使用这个方案。

需求:

上传图片,识别出内容

代码:

java">@Value("${ocr.url}")
//"http://121.229.10.211:32009/umi/api/ocr"
private String ocrUrl;@PostMapping("/ocr")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "识别图像", notes = "上传图像")
public R<FarmerApplyEntity> ocr(@RequestBody MultipartFile file) throws IOException, ParseException {// 创建临时文件File tfile = File.createTempFile("tempfile", file.getOriginalFilename());// 写入数据file.transferTo(tfile);// 构造请求体JSONObject inputObject = new JSONObject();String base64 = Base64.encode(tfile);inputObject.put("base64", base64.replace("data:image/png;base64,", ""));JSONObject options = new JSONObject();options.put("ocr.language", "models/config_chinese.txt");options.put("ocr.cls", true);options.put("ocr.limit_side_len", 4320);options.put("tbpu.parser", "multi_none");options.put("data.format", "txt");inputObject.put("options", options);String jsonInputString = inputObject.toString();// 发送 POST 请求HttpResponse response = HttpUtil.createPost(ocrUrl).contentType("application/json") // 设置请求头,指定内容类型为 JSON.body(jsonInputString) // 设置请求体.execute();System.out.printf(JSON.parseObject(response.body()).toJSONString());JSONObject retObject = JSON.parseObject(response.body());JSONArray data = retObject.getJSONArray("data");// 将JSONArray里的每一个object里的text串联起来// 用于存储串联结果的StringBuilderStringBuilder concatenatedText = new StringBuilder();// 遍历JSONArrayfor (int i = 0; i < data.size(); i++) {// 获取每个JSONObjectJSONObject jsonObject = data.getJSONObject(i);// 获取text属性String text = jsonObject.getString("text");// 将text添加到StringBuilderconcatenatedText.append(text);}tfile.delete();return R.data(contractService.boxOcrResult(concatenatedText.toString()));}

难点:

需要自己启动一个ocr的服务,上面代码是调用这个服务进行识别,ocrUrl就是启动后的服务访问地址,下载发行版启动服务(仅支持win7以上)

如果系统是linux则需要使用docker 构建镜像启动服务

参考文档:

Umi-OCR: Umi-OCR 是一款免费、开源、可批量的离线 OCR 软件,基于 PaddleOCR,适用于 Windows10/11 平台


http://www.ppmy.cn/embedded/142930.html

相关文章

服务发布策略:包括蓝绿部署、A/B测试以及金丝雀发布

原文地址:https://help.aliyun.com/zh/mse/use-cases/service-release-strategies?spma2c4g.11186623.help-menu-123350.d_3_2_3.460a525dLQbFlG&scm20140722.H_375329._.OR_help-T_cn#DAS#zh-V_1 蓝绿部署 蓝绿部署需要对服务的新版本进行冗余部署&#xff0c;一般新版…

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么&#xff1f; PR&#xff0c;全称Pull Request&#xff08;拉取请求&#xff09;&#xff0c;是一种非常重要的协作机制&#xff0c;它是 Git 和 GitHub 等代码托管平台中常见的功能&#xff0c;被广泛用于参与社区贡献&#xff0c;从而促进项目的发展。 PR的整个过…

滑动窗口最大值

滑动窗口最大值 1、题目描述2、解答思路 1、题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。 2、解答思路 本题需要…

Ubuntu 20.04 下 ROS 工作空间的详解与应用

Ubuntu 20.04 下 ROS 工作空间的详解与应用 在机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;生态系统中&#xff0c;工作空间&#xff08;Workspace&#xff09;是开发和管理ROS包&#xff08;Package&#xff09;的核心环境。对于使用Ubuntu 20.04的开…

C 语言 “神秘魔杖”—— 指针初相识,解锁编程魔法大门(一)

文章目录 一、概念1、取地址操作符&#xff08;&&#xff09;2、解引用操作符&#xff08;*&#xff09;3、指针变量1、 声明和初始化2、 用途 二、内存和地址三、指针变量类型的意义1、 指针变量类型的基本含义2、 举例说明不同类型指针变量的意义 四、const修饰指针1、co…

Windows远程桌面连接到Linux

我的电脑是一台瘦客户端&#xff0c;公司设置的不能安装其他软件&#xff0c;里面只有几个软件&#xff0c;还好有一个远程桌面&#xff08;Remote Desktop Connection&#xff09;&#xff0c;我想连接到另一台Linux的电脑上。 在Linux上安装xrdp&#xff1a; sudo apt insta…

hhdb数据库介绍(10-32)

管理 数据归档 数据归档支持对对于日志流水类型的表&#xff0c;按照时间定期对历史数据进行归档&#xff0c;转储非生产存储&#xff0c;清理生产历史数据&#xff0c;同时支持对归档数据进行实时查询。 数据归档规则列表展示了每条规则的详情信息&#xff0c;包括&#xf…

PyAutoGUI自动化入门文档

这不得不提我们的办公神器&#xff0c;PyAutoGUI啦! 轻量级办公软件&#xff0c;主要的功能有&#xff1a; 键鼠控制 屏幕截图 多种提示框 好&#xff0c;我们从安装开始&#xff0c;汉化这个文档吧&#xff01; Chapter 1. 安装 安装操作还是比较简单的&#xff1a; ⏪Wi…