先说业务场景,公司在运营过程中,总会因为各种各样的原因,导致客户投诉。
有一部分是线上小程序投诉,这点没什么,数据直接落库,后续很容易进行追踪问题并解决。
难的是另外一部分客户投诉,由于是门店POS
点单,往往客户只有一张小票。
在这种情况下,客户投诉只能提供小票,门店只能拍照或者截图,将问题上报,再由总店运营人员将问题录入系统。
简单问题,运营人员录入后自己能够解决;复杂问题需要开发介入解决,这一来二去,简单问题都可能拖到第二天才能解决,更别提需要开发介入的复杂客诉了。
如何解决这种问题?我们分析下来,一大部分时间都在于,各门店收到投诉录入的这一步。
门店人员一方面要服务下单出餐,一方面要接收小票截图上报,而这上报的一步,要输入一大长串的订单号,并描述出现了什么问题。
所以一旦在高峰期,这种客诉的单子就只能积压,而这一等就等到了深夜,往往只能等到第二天才能在系统上看到客诉情况。
餐饮这一块,最注重客户体验,门店需要及时响应解决;如果总店想要及时发现分店情况,那就需要另一种更为快捷的上报方式。
但公司在这一块,采用了其他方案进行录入,但我个人推荐更优秀成熟的产品来完成这一步操作,腾讯云OCR
完美匹配我的需求。
腾讯云OCR
是腾讯云推出的一款强大的图像识别服务,可以精准快速的将图片中的文字内容提取出来。它提供有不同种类的预识别场景,能够处理多种不同场景下的图片,适用于政务处理、票据核销、行业表单填写、国际物流管理、人寿保险理赔、A在线问诊、律师事务所合同审查及供应链合同审核等多种应用场景。
在代码的开发编写前,可以使用OCR Demo试用一下
可以看到效果非常好,能精准的识别票据中的title
、content
而且还可以返回文字识别区域的坐标,这对于我们录入后续的内容非常有帮助,也就是可操作性非常大
在编码开始前,需要一定的Java
基础,当然腾讯云OCR
有其他语言的SDK
及接口文档,由于本人是Java
开发,首选当然是Java
好的,引入两个maven
依赖
<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
,将secretId
和secretKey
放到我们的配置文件中
tencent-api:
secret-id: xxxxxxxxxxxx
secret-key: xxxxxxxxxxx
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;
}
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
接口了
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
返回了啥内容,我找了业务上的一张小票,避免泄露公司相关信息,下面这张图片会马赛克处理
我们识别一下这张图片,看看响应结果
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* {"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
就能获取到订单编号
{
"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
数据进行过滤清洗,我这边比较简单判断一下
@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();
}
{
"errCode": 0,
"errMsg": "成功",
"data": "14Q46AEK9KEM8"
}
针对更复杂的场景,最好通过ItemPolygon
来确定目标位置,还有文本结合处理的情况,也需要坐标固定
在上面的示例中,仅仅只需要简单的代码,就能完成对腾讯云OCR
的调用。
我这边的代码比较简单,后续的功能涉及业务,就不再展示了。
最后介绍一下腾讯云OCR
产品优势
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。