前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >腾讯云OCR助力完成快速录入工单

腾讯云OCR助力完成快速录入工单

原创
作者头像
半月无霜
修改2025-01-03 19:21:53
修改2025-01-03 19:21:53
8400
代码可运行
举报
文章被收录于专栏:半月无霜半月无霜
运行总次数:0
代码可运行

一、业务需求背景

先说业务场景,公司在运营过程中,总会因为各种各样的原因,导致客户投诉。

有一部分是线上小程序投诉,这点没什么,数据直接落库,后续很容易进行追踪问题并解决。

难的是另外一部分客户投诉,由于是门店POS点单,往往客户只有一张小票。

在这种情况下,客户投诉只能提供小票,门店只能拍照或者截图,将问题上报,再由总店运营人员将问题录入系统。

简单问题,运营人员录入后自己能够解决;复杂问题需要开发介入解决,这一来二去,简单问题都可能拖到第二天才能解决,更别提需要开发介入的复杂客诉了。

如何解决这种问题?我们分析下来,一大部分时间都在于,各门店收到投诉录入的这一步。

门店人员一方面要服务下单出餐,一方面要接收小票截图上报,而这上报的一步,要输入一大长串的订单号,并描述出现了什么问题。

所以一旦在高峰期,这种客诉的单子就只能积压,而这一等就等到了深夜,往往只能等到第二天才能在系统上看到客诉情况。

餐饮这一块,最注重客户体验,门店需要及时响应解决;如果总店想要及时发现分店情况,那就需要另一种更为快捷的上报方式。

但公司在这一块,采用了其他方案进行录入,但我个人推荐更优秀成熟的产品来完成这一步操作,腾讯云OCR完美匹配我的需求。

二、入门腾讯云OCR

腾讯云OCR是腾讯云推出的一款强大的图像识别服务,可以精准快速的将图片中的文字内容提取出来。它提供有不同种类的预识别场景,能够处理多种不同场景下的图片,适用于政务处理、票据核销、行业表单填写、国际物流管理、人寿保险理赔、A在线问诊、律师事务所合同审查及供应链合同审核等多种应用场景。

在代码的开发编写前,可以使用OCR Demo试用一下

image-20250103134408234
image-20250103134408234

可以看到效果非常好,能精准的识别票据中的titlecontent

而且还可以返回文字识别区域的坐标,这对于我们录入后续的内容非常有帮助,也就是可操作性非常大

三、助力快速录入

在编码开始前,需要一定的Java基础,当然腾讯云OCR有其他语言的SDK及接口文档,由于本人是Java开发,首选当然是Java

好的,引入两个maven依赖

代码语言:javascript
代码运行次数:0
复制
 <dependency>
     <groupId>com.tencentcloudapi</groupId>
     <artifactId>tencentcloud-sdk-java</artifactId>
     <version>3.1.1165</version>
 </dependency>
 <dependency>
     <groupId>com.tencentcloudapi</groupId>
     <artifactId>tencentcloud-sdk-java-ocr</artifactId>
     <version>3.1.1162</version>
 </dependency>

java开发首选,还是SpringBoot主导的web项目,相关的依赖我就不列了

我们将主要的认证抽取出bean,将secretIdsecretKey放到我们的配置文件中

代码语言:javascript
代码运行次数:0
复制
 tencent-api:
   secret-id: xxxxxxxxxxxx
   secret-key: xxxxxxxxxxx
代码语言:javascript
代码运行次数:0
复制
 package com.banmoon.config;
 ​
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 ​
 @Data
 @Configuration
 @ConfigurationProperties("tencent-api")
 public class TencentApiProperties {
 ​
     /**
      * 腾讯云SecretId
      */
     private String secretId;
 ​
     /**
      * 腾讯云SecretKey
      */
     private String secretKey;
 ​
 }
代码语言:javascript
代码运行次数:0
复制
 package com.banmoon.config;
 ​
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.profile.ClientProfile;
 import com.tencentcloudapi.common.profile.HttpProfile;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 ​
 import javax.annotation.Resource;
 ​
 @Configuration
 public class TencentApiConfig {
 ​
     public static final String OCR_CLIENT_PROFILE = "ocrClientProfile";
 ​
     @Resource
     private TencentApiProperties tencentApiProperties;
 ​
     @Bean
     public Credential credential() {
         return new Credential(tencentApiProperties.getSecretId(), tencentApiProperties.getSecretKey());
     }
 ​
     @Bean(OCR_CLIENT_PROFILE)
     public ClientProfile ocrClientProfile() {
         HttpProfile httpProfile = new HttpProfile();
         httpProfile.setEndpoint("ocr.tencentcloudapi.com");
         ClientProfile clientProfile = new ClientProfile();
         clientProfile.setHttpProfile(httpProfile);
         return clientProfile;
     }
 ​
 }

配置这一块就好了,接下来就是调用腾讯云OCR接口了

代码语言:javascript
代码运行次数:0
复制
 package com.banmoon.controller;
 ​
 import cn.hutool.core.codec.Base64;
 import com.banmoon.business.obj.dto.ResultData;
 import com.banmoon.obj.request.GeneralAccurateOcrRequest;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;
 import com.tencentcloudapi.ocr.v20181119.OcrClient;
 import com.tencentcloudapi.ocr.v20181119.models.GeneralAccurateOCRRequest;
 import com.tencentcloudapi.ocr.v20181119.models.GeneralAccurateOCRResponse;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 ​
 import java.io.IOException;
 import java.util.Objects;
 ​
 @Slf4j
 @Api(tags = "ocr测试")
 @Validated
 @RestController
 @RequestMapping("/ocr")
 @RequiredArgsConstructor
 public class OcrController {
 ​
     private final Credential credential;
     private final ClientProfile clientProfile;
 ​
     @ApiOperation("精准OCR识别")
     @PostMapping("/generalAccurateOcr")
     public ResultData<?> generalAccurateOcr(@ModelAttribute GeneralAccurateOcrRequest request) throws TencentCloudSDKException, IOException {
         MultipartFile file = request.getFile();
         String imgUrl = request.getImgUrl();
         OcrClient client = new OcrClient(credential, "", clientProfile);
         GeneralAccurateOCRRequest ocrReq = new GeneralAccurateOCRRequest();
         ocrReq.setImageUrl(imgUrl);
         if (Objects.nonNull(file)) {
             byte[] bytes = file.getBytes();
             String base64 = Base64.encode(bytes);
             ocrReq.setImageBase64(base64);
         }
         GeneralAccurateOCRResponse resp = client.GeneralAccurateOCR(ocrReq);
         return ResultData.success(resp);
     }
 ​
 }

简单的代码,先简单看看精准识别OCR返回了啥内容,我找了业务上的一张小票,避免泄露公司相关信息,下面这张图片会马赛克处理

image-20250103183329074
image-20250103183329074

我们识别一下这张图片,看看响应结果

代码语言:javascript
代码运行次数:0
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* {"errCode":0,"errMsg":"成功","data":{"header":{},"skipSign":false,"requestId":"ec2cc64d-4d81-47e0-95aa-178a0adf10e5","angel":9.307688,"angle":9.307688,"textDetections":[{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"码开票","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":399,"y":0,"stream":false},{"header":{},"skipSign":false,"x":431,"y":33,"stream":false},{"header":{},"skipSign":false,"x":410,"y":48,"stream":false},{"header":{},"skipSign":false,"x":378,"y":3,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":3}}","itemPolygon":{"header":{},"skipSign":false,"x":374,"y":142,"width":58,"height":47,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"扫描以下二维码开具电子发票","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":364,"y":0,"stream":false},{"header":{},"skipSign":false,"x":477,"y":134,"stream":false},{"header":{},"skipSign":false,"x":456,"y":150,"stream":false},{"header":{},"skipSign":false,"x":342,"y":3,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":6}}","itemPolygon":{"header":{},"skipSign":false,"x":338,"y":148,"width":156,"height":134,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"6A929797C0","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":631,"y":0,"stream":false},{"header":{},"skipSign":false,"x":679,"y":54,"stream":false},{"header":{},"skipSign":false,"x":656,"y":70,"stream":false},{"header":{},"skipSign":false,"x":609,"y":2,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":4}}","itemPolygon":{"header":{},"skipSign":false,"x":602,"y":105,"width":78,"height":66,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"发票日期为实际开具当日","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":31,"y":0,"stream":false},{"header":{},"skipSign":false,"x":96,"y":110,"stream":false},{"header":{},"skipSign":false,"x":71,"y":124,"stream":false},{"header":{},"skipSign":false,"x":6,"y":12,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":1}}","itemPolygon":{"header":{},"skipSign":false,"x":8,"y":202,"width":106,"height":117,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"码有效期为90天","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":331,"y":0,"stream":false},{"header":{},"skipSign":false,"x":392,"y":69,"stream":false},{"header":{},"skipSign":false,"x":372,"y":84,"stream":false},{"header":{},"skipSign":false,"x":311,"y":3,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":5}}","itemPolygon":{"header":{},"skipSign":false,"x":308,"y":154,"width":91,"height":77,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":",请务必在消费当日申请。","confidence":94,"polygon":[{"header":{},"skipSign":false,"x":6,"y":15,"stream":false},{"header":{},"skipSign":false,"x":86,"y":171,"stream":false},{"header":{},"skipSign":false,"x":60,"y":185,"stream":false},{"header":{},"skipSign":false,"x":0,"y":29,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":2}}","itemPolygon":{"header":{},"skipSign":false,"x":5,"y":221,"width":109,"height":160,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"M Stand","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":719,"y":196,"stream":false},{"header":{},"skipSign":false,"x":812,"y":211,"stream":false},{"header":{},"skipSign":false,"x":808,"y":234,"stream":false},{"header":{},"skipSign":false,"x":716,"y":219,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":7}}","itemPolygon":{"header":{},"skipSign":false,"x":742,"y":284,"width":95,"height":24,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"微信","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":1225,"y":351,"stream":false},{"header":{},"skipSign":false,"x":1283,"y":374,"stream":false},{"header":{},"skipSign":false,"x":1274,"y":397,"stream":false},{"header":{},"skipSign":false,"x":1215,"y":374,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":24}}","itemPolygon":{"header":{},"skipSign":false,"x":1260,"y":355,"width":68,"height":39,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"乐享服","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":1214,"y":374,"stream":false},{"header":{},"skipSign":false,"x":1285,"y":400,"stream":false},{"header":{},"skipSign":false,"x":1276,"y":425,"stream":false},{"header":{},"skipSign":false,"x":1205,"y":399,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":25}}","itemPolygon":{"header":{},"skipSign":false,"x":1254,"y":380,"width":80,"height":41,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"业务日期:2024-12-12星期四","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":475,"y":274,"stream":false},{"header":{},"skipSign":false,"x":790,"y":323,"stream":false},{"header":{},"skipSign":false,"x":785,"y":353,"stream":false},{"header":{},"skipSign":false,"x":470,"y":304,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":8}}","itemPolygon":{"header":{},"skipSign":false,"x":513,"y":398,"width":320,"height":34,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"模糊处理","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":466,"y":310,"stream":false},{"header":{},"skipSign":false,"x":660,"y":339,"stream":false},{"header":{},"skipSign":false,"x":656,"y":369,"stream":false},{"header":{},"skipSign":false,"x":461,"y":340,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":8}}","itemPolygon":{"header":{},"skipSign":false,"x":510,"y":435,"width":198,"height":34,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"AMD","confidence":84,"polygon":[{"header":{},"skipSign":false,"x":1177,"y":443,"stream":false},{"header":{},"skipSign":false,"x":1237,"y":468,"stream":false},{"header":{},"skipSign":false,"x":1229,"y":488,"stream":false},{"header":{},"skipSign":false,"x":1168,"y":463,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":26}}","itemPolygon":{"header":{},"skipSign":false,"x":1228,"y":454,"width":70,"height":37,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"卡名称","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":456,"y":383,"stream":false},{"header":{},"skipSign":false,"x":532,"y":394,"stream":false},{"header":{},"skipSign":false,"x":527,"y":427,"stream":false},{"header":{},"skipSign":false,"x":451,"y":416,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":9}}","itemPolygon":{"header":{},"skipSign":false,"x":512,"y":510,"width":79,"height":36,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"面值","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":783,"y":432,"stream":false},{"header":{},"skipSign":false,"x":836,"y":442,"stream":false},{"header":{},"skipSign":false,"x":830,"y":473,"stream":false},{"header":{},"skipSign":false,"x":777,"y":463,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":10}}","itemPolygon":{"header":{},"skipSign":false,"x":842,"y":507,"width":56,"height":33,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"数量","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":863,"y":444,"stream":false},{"header":{},"skipSign":false,"x":916,"y":454,"stream":false},{"header":{},"skipSign":false,"x":910,"y":486,"stream":false},{"header":{},"skipSign":false,"x":857,"y":476,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":10}}","itemPolygon":{"header":{},"skipSign":false,"x":923,"y":506,"width":56,"height":34,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"金额","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":968,"y":464,"stream":false},{"header":{},"skipSign":false,"x":1019,"y":472,"stream":false},{"header":{},"skipSign":false,"x":1014,"y":502,"stream":false},{"header":{},"skipSign":false,"x":963,"y":494,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":11}}","itemPolygon":{"header":{},"skipSign":false,"x":1031,"y":508,"width":52,"height":32,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"R","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":1171,"y":481,"stream":false},{"header":{},"skipSign":false,"x":1196,"y":489,"stream":false},{"header":{},"skipSign":false,"x":1187,"y":517,"stream":false},{"header":{},"skipSign":false,"x":1162,"y":509,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":27}}","itemPolygon":{"header":{},"skipSign":false,"x":1229,"y":492,"width":32,"height":34,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"YZEN","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":1196,"y":488,"stream":false},{"header":{},"skipSign":false,"x":1286,"y":524,"stream":false},{"header":{},"skipSign":false,"x":1274,"y":554,"stream":false},{"header":{},"skipSign":false,"x":1184,"y":517,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":27}}","itemPolygon":{"header":{},"skipSign":false,"x":1252,"y":495,"width":103,"height":54,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"00O SERIES","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":1151,"y":522,"stream":false},{"header":{},"skipSign":false,"x":1229,"y":552,"stream":false},{"header":{},"skipSign":false,"x":1220,"y":574,"stream":false},{"header":{},"skipSign":false,"x":1142,"y":544,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":28}}","itemPolygon":{"header":{},"skipSign":false,"x":1215,"y":536,"width":89,"height":41,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"5","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":1251,"y":557,"stream":false},{"header":{},"skipSign":false,"x":1283,"y":570,"stream":false},{"header":{},"skipSign":false,"x":1272,"y":597,"stream":false},{"header":{},"skipSign":false,"x":1240,"y":584,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":28}}","itemPolygon":{"header":{},"skipSign":false,"x":1319,"y":554,"width":41,"height":37,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"模糊处理","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":445,"y":457,"stream":false},{"header":{},"skipSign":false,"x":603,"y":482,"stream":false},{"header":{},"skipSign":false,"x":598,"y":516,"stream":false},{"header":{},"skipSign":false,"x":440,"y":492,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":12}}","itemPolygon":{"header":{},"skipSign":false,"x":514,"y":585,"width":161,"height":37,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"5.00","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":769,"y":508,"stream":false},{"header":{},"skipSign":false,"x":825,"y":517,"stream":false},{"header":{},"skipSign":false,"x":820,"y":548,"stream":false},{"header":{},"skipSign":false,"x":764,"y":538,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":13}}","itemPolygon":{"header":{},"skipSign":false,"x":841,"y":584,"width":58,"height":32,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"1","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":880,"y":525,"stream":false},{"header":{},"skipSign":false,"x":910,"y":528,"stream":false},{"header":{},"skipSign":false,"x":907,"y":562,"stream":false},{"header":{},"skipSign":false,"x":877,"y":559,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":14}}","itemPolygon":{"header":{},"skipSign":false,"x":954,"y":581,"width":33,"height":37,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"5.00","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":955,"y":537,"stream":false},{"header":{},"skipSign":false,"x":1009,"y":547,"stream":false},{"header":{},"skipSign":false,"x":1004,"y":576,"stream":false},{"header":{},"skipSign":false,"x":950,"y":566,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":15}}","itemPolygon":{"header":{},"skipSign":false,"x":1029,"y":582,"width":57,"height":32,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"合计金额","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":432,"y":537,"stream":false},{"header":{},"skipSign":false,"x":535,"y":553,"stream":false},{"header":{},"skipSign":false,"x":530,"y":586,"stream":false},{"header":{},"skipSign":false,"x":427,"y":570,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":16}}","itemPolygon":{"header":{},"skipSign":false,"x":514,"y":666,"width":105,"height":35,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"5.00","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":947,"y":611,"stream":false},{"header":{},"skipSign":false,"x":1001,"y":620,"stream":false},{"header":{},"skipSign":false,"x":997,"y":650,"stream":false},{"header":{},"skipSign":false,"x":942,"y":641,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":18}}","itemPolygon":{"header":{},"skipSign":false,"x":1034,"y":657,"width":56,"height":31,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"微信","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":427,"y":575,"stream":false},{"header":{},"skipSign":false,"x":482,"y":584,"stream":false},{"header":{},"skipSign":false,"x":476,"y":618,"stream":false},{"header":{},"skipSign":false,"x":422,"y":609,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":17}}","itemPolygon":{"header":{},"skipSign":false,"x":515,"y":705,"width":57,"height":36,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"5.00","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":943,"y":650,"stream":false},{"header":{},"skipSign":false,"x":997,"y":658,"stream":false},{"header":{},"skipSign":false,"x":993,"y":687,"stream":false},{"header":{},"skipSign":false,"x":939,"y":679,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":19}}","itemPolygon":{"header":{},"skipSign":false,"x":1036,"y":695,"width":57,"height":31,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"订单编号:14Q46AEK9KEM8","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":418,"y":655,"stream":false},{"header":{},"skipSign":false,"x":692,"y":695,"stream":false},{"header":{},"skipSign":false,"x":688,"y":726,"stream":false},{"header":{},"skipSign":false,"x":413,"y":686,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":20}}","itemPolygon":{"header":{},"skipSign":false,"x":519,"y":781,"width":279,"height":37,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"下单时间:2024-12-12 00:14:53","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":414,"y":695,"stream":false},{"header":{},"skipSign":false,"x":757,"y":742,"stream":false},{"header":{},"skipSign":false,"x":752,"y":773,"stream":false},{"header":{},"skipSign":false,"x":410,"y":725,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":21}}","itemPolygon":{"header":{},"skipSign":false,"x":521,"y":817,"width":348,"height":40,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"扫码开票","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":632,"y":823,"stream":false},{"header":{},"skipSign":false,"x":734,"y":838,"stream":false},{"header":{},"skipSign":false,"x":729,"y":870,"stream":false},{"header":{},"skipSign":false,"x":627,"y":855,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":22}}","itemPolygon":{"header":{},"skipSign":false,"x":757,"y":915,"width":105,"height":35,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"请使用微信或支付宝扫描以下二维码开具电子发票","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":417,"y":833,"stream":false},{"header":{},"skipSign":false,"x":948,"y":905,"stream":false},{"header":{},"skipSign":false,"x":944,"y":937,"stream":false},{"header":{},"skipSign":false,"x":412,"y":865,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":23}}","itemPolygon":{"header":{},"skipSign":false,"x":547,"y":947,"width":538,"height":48,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"二维码有效期为90天","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":564,"y":892,"stream":false},{"header":{},"skipSign":false,"x":783,"y":923,"stream":false},{"header":{},"skipSign":false,"x":779,"y":955,"stream":false},{"header":{},"skipSign":false,"x":560,"y":923,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":23}}","itemPolygon":{"header":{},"skipSign":false,"x":701,"y":991,"width":224,"height":37,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"发票日期为实际开具当日","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":481,"y":1256,"stream":false},{"header":{},"skipSign":false,"x":760,"y":1305,"stream":false},{"header":{},"skipSign":false,"x":754,"y":1341,"stream":false},{"header":{},"skipSign":false,"x":475,"y":1292,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":29}}","itemPolygon":{"header":{},"skipSign":false,"x":678,"y":1369,"width":285,"height":40,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"如您需要当日发票,请务必在消费当日申请。","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":366,"y":1280,"stream":false},{"header":{},"skipSign":false,"x":864,"y":1369,"stream":false},{"header":{},"skipSign":false,"x":857,"y":1406,"stream":false},{"header":{},"skipSign":false,"x":359,"y":1317,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":29}}","itemPolygon":{"header":{},"skipSign":false,"x":568,"y":1411,"width":508,"height":46,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"火星店(请勿下单)","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":492,"y":1418,"stream":false},{"header":{},"skipSign":false,"x":702,"y":1458,"stream":false},{"header":{},"skipSign":false,"x":695,"y":1495,"stream":false},{"header":{},"skipSign":false,"x":485,"y":1455,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":30}}","itemPolygon":{"header":{},"skipSign":false,"x":715,"y":1527,"width":215,"height":44,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"23mm f/1.62 1/51s ISO800","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":723,"y":1758,"stream":false},{"header":{},"skipSign":false,"x":1219,"y":1758,"stream":false},{"header":{},"skipSign":false,"x":1219,"y":1799,"stream":false},{"header":{},"skipSign":false,"x":723,"y":1799,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":33}}","itemPolygon":{"header":{},"skipSign":false,"x":998,"y":1745,"width":498,"height":121,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"Leica","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":600,"y":1782,"stream":false},{"header":{},"skipSign":false,"x":670,"y":1782,"stream":false},{"header":{},"skipSign":false,"x":670,"y":1815,"stream":false},{"header":{},"skipSign":false,"x":600,"y":1815,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":32}}","itemPolygon":{"header":{},"skipSign":false,"x":881,"y":1857,"width":75,"height":45,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"31°19'20\"N 121°27'0\"E","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":723,"y":1817,"stream":false},{"header":{},"skipSign":false,"x":1012,"y":1817,"stream":false},{"header":{},"skipSign":false,"x":1012,"y":1849,"stream":false},{"header":{},"skipSign":false,"x":723,"y":1849,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":33}}","itemPolygon":{"header":{},"skipSign":false,"x":1008,"y":1836,"width":291,"height":80,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"XIaomI 15","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":58,"y":1762,"stream":false},{"header":{},"skipSign":false,"x":285,"y":1758,"stream":false},{"header":{},"skipSign":false,"x":285,"y":1798,"stream":false},{"header":{},"skipSign":false,"x":59,"y":1801,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":31}}","itemPolygon":{"header":{},"skipSign":false,"x":343,"y":1896,"width":231,"height":80,"stream":false},"stream":false},{"header":{},"skipSign":false,"wordCoordPoint":[],"detectedText":"2024.12.12 00:27:43","confidence":100,"polygon":[{"header":{},"skipSign":false,"x":55,"y":1817,"stream":false},{"header":{},"skipSign":false,"x":313,"y":1817,"stream":false},{"header":{},"skipSign":false,"x":313,"y":1847,"stream":false},{"header":{},"skipSign":false,"x":55,"y":1847,"stream":false}],"words":[],"advancedInfo":"{\"Parag\":{\"ParagNo\":31}}","itemPolygon":{"header":{},"skipSign":false,"x":349,"y":1949,"width":260,"height":73,"stream":false},"stream":false}],"stream":false}}
*/

这边我们主要看这一个结果,detectedText就能获取到订单编号

代码语言:javascript
代码运行次数:0
复制
 {
     "header": {},
     "skipSign": false,
     "wordCoordPoint": [],
     "detectedText": "订单编号:14Q46AEK9KEM8",
     "confidence": 100,
     "polygon": [
         {
             "header": {},
             "skipSign": false,
             "x": 418,
             "y": 655,
             "stream": false
         },
         {
             "header": {},
             "skipSign": false,
             "x": 692,
             "y": 695,
             "stream": false
         },
         {
             "header": {},
             "skipSign": false,
             "x": 688,
             "y": 726,
             "stream": false
         },
         {
             "header": {},
             "skipSign": false,
             "x": 413,
             "y": 686,
             "stream": false
         }
     ],
     "words": [],
     "advancedInfo": "{\"Parag\":{\"ParagNo\":20}}",
     "itemPolygon": {
         "header": {},
         "skipSign": false,
         "x": 519,
         "y": 781,
         "width": 279,
         "height": 37,
         "stream": false
     },
     "stream": false
 }

所以,只要确定了位置,就能准确的识别出订单编号,有了订单编号,我们就能快速的进行上报问题

再写一个接口,这个接口将图片识别之后,抽取出指定的订单编号;

我们主要是对TextDetection数据进行过滤清洗,我这边比较简单判断一下

代码语言:javascript
代码运行次数:0
复制
    @ApiOperation("精准OCR识别-抽取订单编号")
    @PostMapping("/generalAccurateOcrReturnOrderNumber")
    public ResultData<String> generalAccurateOcrReturnOrderNumber(GeneralAccurateOcrRequest request) throws TencentCloudSDKException, IOException {
        ResultData<?> resultData = this.generalAccurateOcr(request);
        if (resultData.isSuccess()) {
            GeneralAccurateOCRResponse resp = (GeneralAccurateOCRResponse) resultData.getData();
            String orderNumber = Arrays.stream(resp.getTextDetections())
                    .map(TextDetection::getDetectedText)
                    .filter(detectedText -> detectedText.startsWith("订单编号"))
                    .findFirst()
                    .map(text -> StrUtil.subSuf(text, 5))
                    .orElse(null);
            return ResultData.success(orderNumber);
        }
        return ResultData.fail();
    }
代码语言:javascript
代码运行次数:0
复制
 {
     "errCode": 0,
     "errMsg": "成功",
     "data": "14Q46AEK9KEM8"
 }

针对更复杂的场景,最好通过ItemPolygon来确定目标位置,还有文本结合处理的情况,也需要坐标固定

image-20250103185627146
image-20250103185627146

四、最后

在上面的示例中,仅仅只需要简单的代码,就能完成对腾讯云OCR的调用。

我这边的代码比较简单,后续的功能涉及业务,就不再展示了。

最后介绍一下腾讯云OCR产品优势

  • 高精度
    • 支持任意版式的卡证票据识别,各字段精度均处于业界领先水平,文本基础识别准确率达到98%以上,文本结构化准确率达到85%以上。
  • 完备性
    • 支持多种常见版式的数据结构化提取,如警察证、教师资格证、道路运输证等,适用于多行业场景。
  • 易用性
    • 用户仅需简单的几步配置,即可定制个性化需求模板,快速提取结构化数据,实现高效录入。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、业务需求背景
  • 二、入门腾讯云OCR
  • 三、助力快速录入
  • 四、最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档