最近作者项目中用到了身份证识别跟营业执照的OCR识别,就研究了一下百度云跟腾讯云的OCR产品接口。

1.腾讯云OCR


收费:身份证OCR和营业执照OCR接口,每个接口每个月各有1000次的免费调用

接口说明:

  1. 身份证OCR接口 -

    https://cloud.tencent.com/document/product/866/33524

  2. 营业执照OCR接口-

    https://cloud.tencent.com/document/product/866/17598

身份证-OCR接入

  1. 引入腾讯的SDK及JSON

<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.0.</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>

  2.前端html代码

<form action="/ocr/uploadFile" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<br />
<input type="radio" name="card_side" value="FRONT"> 正面 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="radio" name="card_side" value="BACK"> 反面
<br />
<input type="submit" value="提交"> </form>

  3.后端代码

@PostMapping("uploadFile")
@ResponseBody
public IDCardOCRResponse OCRIdCardTest(@RequestParam(value = "file") MultipartFile file,@RequestParam(value = "card_side") String cardSize,Model model){
try {
Credential cred = new Credential("AKIDGQfhYTqEs0DMvUQH93wXKsIX", "7adThzEEH6mK6zg9MMwX0"); HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ocr.tencentcloudapi.com"); ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile); OcrClient client = new OcrClient(cred, "ap-beijing", clientProfile);
Map<String, String> params = new HashMap<>();
params.put("ImageBase64", getBase64FromInputStream(file.getInputStream()));
params.put("CardSide", cardSize); System.out.println(getBase64FromInputStream(file.getInputStream()));
IDCardOCRRequest req = IDCardOCRRequest.fromJsonString(JSONObject.fromObject(params).toString(), IDCardOCRRequest.class);
IDCardOCRResponse resp = client.IDCardOCR(req);
return resp;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null; }

说明:new Credential("secretId","secretKey"),这两个参数在腾讯云控制台申请

  4.getBase64FromInputStream代码,把MultipartFile 转为base64

public static String getBase64FromInputStream(InputStream in) {
// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] data = null;
// 读取图片字节数组
try {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = in.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
data = swapStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return new String(Base64.encodeBase64(data));
}

运行前端html码,选择身份证图片,点击提交就可以返回身份证的信息了。

营业执照-OCR

1.前端html代码

<form action="/ocr/bizlicense" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<br /> <input type="submit" value="提交"> </form>

2.后端代码

@PostMapping("bizlicense")
@ResponseBody
public String OCRBizlicenseTest(@RequestParam(value = "file") MultipartFile file) throws Exception{
RestTemplate restTemplate = new RestTemplate();
String apiUrl="https://recognition.image.myqcloud.com/ocr/bizlicense";
HttpHeaders headers = new HttpHeaders();
headers.set("host", "recognition.image.myqcloud.com");
headers.set("content-type", "application/json");
String authorization=QQOCRSignUtils.appSign(XXXX, "AKIDGQfhYTqEs0DXXX", "7adThzEEH6mKXXX", "", 10L);
headers.set("authorization",authorization ); JSONObject params = new JSONObject();
params.put("appid", "XXX");
params.put("image", getBase64FromInputStream(file.getInputStream()));
HttpEntity<JSONObject> entity = new HttpEntity<JSONObject>(params, headers);
HttpEntity<String> response = restTemplate.postForEntity(apiUrl, entity, String.class);
return response.getBody();
}

3.QQOCRSignUtils.appSign

/**
* 生成 Authorization 签名字段
*
* @param appId
* @param secretId
* @param secretKey
* @param bucketName
* @param expired
* @return
* @throws Exception
*/
public static String appSign(long appId, String secretId, String secretKey, String bucketName,
long expired) throws Exception {
long now = System.currentTimeMillis() / 1000;
int rdm = Math.abs(new Random().nextInt());
String plainText = String.format("a=%d&b=%s&k=%s&t=%d&e=%d&r=%d", appId, bucketName,
secretId, now, now + expired, rdm);
byte[] hmacDigest = HmacSha1(plainText, secretKey);
byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length];
System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);
System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length,
plainText.getBytes().length);
return Base64Encode(signContent);
}

运行前端html码,选择营业执照图片,点击提交就可以返回营业执照的信息了。

2.百度OCR


通过以下步骤创建OCR应用,作者当时在这一步花了很长时间

创建完之后就可以拿到appId,API Key,Secret Key,就可以调用百度提供的api了

收费:身份证OCR和营业执照OCR接口,每个接口每天各有500次的免费调用

接口说明:

  1. 身份证OCR接口 -

    https://cloud.baidu.com/doc/OCR/OCR-API.html#.E8.BA.AB.E4.BB.BD.E8.AF.81.E8.AF.86.E5.88.AB

  2. 营业执照OCR接口-

    https://cloud.baidu.com/doc/OCR/OCR-API.html#.E8.90.A5.E4.B8.9A.E6.89.A7.E7.85.A7.E8.AF.86.E5.88.AB

 

身份证OCR 

只列出后端的代码,前端代码跟腾讯的一样,只不过前后面身份证枚举值不一样,参考接口文档说明。

@PostMapping("ocridcard")
@ResponseBody
public String OCRIdCardTest(@RequestParam(value = "file") MultipartFile file,@RequestParam(value = "card_side") String cardSize,Model model){
try {
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> response = restTemplate.postForEntity("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXXX&client_secret=XXXXXX",null,String.class);
JSONObject jsonObject = JSONObject.fromObject(response.getBody());
System.out.println(response.getBody());
String accessToken = jsonObject.getString("access_token"); String apiUrl="https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token="+accessToken;
HttpHeaders headers = new HttpHeaders();
headers.set("content-type", "application/x-www-form-urlencoded"); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.add("detect_direction", "true");
params.add("id_card_side", cardSize);
params.add("image", Base64Utils.getBase64FromInputStream(file.getInputStream()));
params.add("detect_risk", "true");
System.out.println(Base64Utils.getBase64FromInputStream(file.getInputStream()));
System.out.println(URLDecoder.decode(URLEncoder.encode(Base64Utils.getBase64FromInputStream(file.getInputStream()),"UTF-8"),"UTF-8"));
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers);
response = restTemplate.postForEntity(apiUrl, entity, String.class);
return response.getBody(); } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null; }

营业执照OCR

@PostMapping("ocrbusinesslicense")
@ResponseBody
public String OCRBusinessLicenseTest(@RequestParam(value = "file") MultipartFile file,Model model){
try {
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> response = restTemplate.postForEntity("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXX&client_secret=XXXXXX",null,String.class);
JSONObject jsonObject = JSONObject.fromObject(response.getBody());
System.out.println(response.getBody());
String accessToken = jsonObject.getString("access_token"); String apiUrl="https://aip.baidubce.com/rest/2.0/ocr/v1/business_license?access_token="+accessToken;
HttpHeaders headers = new HttpHeaders();
headers.set("content-type", "application/x-www-form-urlencoded"); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.add("detect_direction", "true");
params.add("image", Base64Utils.getBase64FromInputStream(file.getInputStream())); System.out.println(Base64Utils.getBase64FromInputStream(file.getInputStream()));
System.out.println(URLDecoder.decode(URLEncoder.encode(Base64Utils.getBase64FromInputStream(file.getInputStream()),"UTF-8"),"UTF-8"));
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers);
response = restTemplate.postForEntity(apiUrl, entity, String.class);
return response.getBody(); } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null; }
作者:Eric.Chen
出处:https://www.cnblogs.com/lc-chenlong

如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载

OCR识别的更多相关文章

  1. Atitit  ocr识别原理 与概论 attilax总结

    Atitit  ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...

  2. 基于Python实现对PDF文件的OCR识别

    http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...

  3. OCR识别-python版(一)

    需求:识别图片中的文字信息环境:windows系统 开发语言:python 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.pyocr 网络通直接使用命令:pip ...

  4. 汽车Vin码识别——可以嵌入到手机里的新OCR识别技术

              汽车Vin码识别(车架号识别),顾名思义,就是识别汽车的Vin码(车架号),汽车Vin码识别(车架号识别)利用的是OCR识别技术,支持视频流获取图像,自动触发识别,另外汽车Vin码 ...

  5. 汽车Vin码识别—— 一款二手车行业值得拥有的OCR识别软件

    一.汽车Vin码识别产品描述 汽车Vin码识别系统,主要应用在智能手机IOS与Android两个平台中.前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的Vin码(车架号),即可轻松识别出车辆 ...

  6. 发票OCR识别/票据OCR自动识别

    对于一些大的集团公司来说,分散式财务管理模式管理效率不高,管理成本相对较高,同时也制约了集团企业发展战略的实施,因而需要建设财务共享中心.一个企业想建造财务共享中心,面临的难题是大量的数据采集和信息处 ...

  7. 采用OCR识别自动识别财务报表

    一.         财务报表有什么作用 财务报表又叫会计报表,包含:资产负债表.损益表.现金流量表三表.财务报表对企业经营状况有重要的参考意义: n  全面系统地揭示企业一定时期的财务状况.经营成果 ...

  8. 深入浅出了解OCR识别票据原理(Applying OCR Technology for Receipt Recognition)

    原文:Applying OCR Technology for Receipt Recognition 译文:深入浅出了解OCR识别票据原理 英文票据识别技术, 非中文票据识别技术, 中文情况的ocr更 ...

  9. 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片

    http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...

随机推荐

  1. php 记录日志时 基础的日志格式

     2019-02-19 11:29:56  /api/shop/shopManagements?shopId=undefined REQUEST:HTTP://mutest.drcloud.cn/mo ...

  2. [JZOJ3615]【NOI2014模拟】数列(平面几何+二维线段树)

    Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|. 你需要写一个程序支持2种操作(k都是正 ...

  3. ionic3+angular4开发混合app 之自定义组件

    这里主要是记录ionic3+angular4开发混合app时自定义组件,我想自定义组件的方法和angular4应该类似,具体在纯angular4中自定义组件,暂时没有实践,个人觉得差别不大,之后实践了 ...

  4. Linux服务器运维基本命令

     ========Linux 服务器常用命令================ cd / 根目录cd ../ 上级目录   ls 列出文件目录    clear 清空控制台tar cvzf name.C ...

  5. vue的风格指南(必要的)

    1.v-if与v-for不要放在同一个元素上 当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级.永远不要把 v-if 和 v-for 同时用在同一个元素上. 一般我 ...

  6. 菜鸡谈OO 第一单元总结

    “OOP永远是我的好朋友爸爸!” ——来自某无能狂怒的菜鸡 身处在OO的第一个摸鱼黄金周中的我,感觉到了巨大的满足感.如果写博客这种充满意义的事情可以代替我们亲爱的作业,那么我提议每周来两个:)下面开 ...

  7. Python练手例子(13)

    73.反向输出一个链表. #python3.7 if __name__ == '__main__': ptr = [] for i in range(5): num = int(input('Plea ...

  8. ava怎样将"1413863429"字符串转换成datetime格式

    .....一般来说应该是一个 毫秒数 String str ="1413863429"; Long timeLong = Long.parseLong(str); SimpleDa ...

  9. es5中的for in 与es6中的for of的用法与区别

    for in 用与循环遍历对象中的属性键值 for of用于循环遍历出数组中的属性值 for in 也可以遍历数组,但是局限是他会把数组的其他属性键值也会遍历出,例如给数组添加一个属性arr.name ...

  10. Mesos源码分析(16): mesos-docker-executor的运行

    mesos-docker-executor的运行代码在src/docker/executor.cpp中   int main(int argc, char** argv) {   GOOGLE_PRO ...