身份证ocr识别是什么意思?高精度OCR识别身份证信息

大雄 460 2022-09-12

基本介绍

蚂蚁人脸认证是一组对用户身份信息进行判断、核验的服务套件,提供人脸核身、活体检测、人脸比对、卡证识别等各类实名信息认证能力,主要解决行业内大量对用户身份信息核实的需求场景,已广泛应用于政务、金融、直播、游戏、数字藏品、共享出行、教育、招聘、房地产等众多行业领域。

能力介绍

人脸核身

人脸核身能力搭载真人检测、人脸比对等生物识别技术以及权威数据库,可快速对自然人真实身份进行核验。通过活体检测技术,先判断视频中是否为真人,判断为真人后,再判断该视频中的人与权威库的证件照是否属于同一个人。本产品安全稳定、通过率高,为用户提供便捷的数字身份识别解决方案,满足多种场景下身份核验的业务需求。支持大陆居民身份证和港澳台往来大陆通行证身份核验,支持眨眼、摇头、张嘴等多种动作活体模式。

图片1.png

活体检测

活体检测是针对高安全性要求判断是否是真人的一种技术,通过实时检测分析拍摄的视频流,从而确认当前用户是否为真人。主要用于防止电子屏、打印照片、挖孔照片、三维头模/面具等各种不同类型的攻击,支持眨眼、摇头、张嘴等多种动作活体模式,适用于各类验证场景。支持无障碍“关怀模式”。

卡证识别

  • 身份证识别:使用OCR技术,自动识别录入用户身份信息,可应用于金融、保险、电商、O2O、直播等场景,对用户、商家、主播等进行实名身份认证,有效降低用户输入成本,控制业务风险。支持中国大陆居民二代身份证正反面所有字段的识别,包括姓名、性别、民族、出生日期、住址、公民身份证号、签发机关、有效期限等8个字段的识别,识别准确度需要达到99%以上。

  • 银行卡识别:支持对中国大陆主流银行卡正面关键字段的检测与识别,包括卡号、卡类型、卡名字、银行信息、有效期。

产品特色

金融级安全防控

该产品基于多年金融行业的实名认证积累,并经大规模场景验证,具有金融级的精准识别准确率,误识率低于 0.01%。

流畅的用户体验

用户无需配合,眨眼交互,秒级验证通过,提升用户认证体验。

服务灵活,自由组合

灵活组合身份证识别、人脸核身、活体检测、人脸对比、权威核验源等,提供人脸核身完整解决方案。

获得国家权威机构安全认证

蚂蚁人脸认证,国内获得中国信通院颁发的两大行业级安全认证和检测报告;在国际,获得iBeta国际安全组织最高等级Level2认证,目前中国只有蚂蚁拿到了此认证。

API列表
API名称
API类型
API描述操作
datadigital.fincloud.generalsaas.face.certify.verify
开始人脸认证服务接口
OpenAPI
人脸核身服务开始认证。请根据返回结果渲染页面。
查看文档
去调试
datadigital.fincloud.generalsaas.face.check.initialize
人脸检测初始化
OpenAPI
人脸检测业务单据初始化
查看文档
去调试
datadigital.fincloud.generalsaas.face.certify.query
查询人脸认证记录接口
OpenAPI
商户在开放认证完成后,调用本接口查询认证状态和相关数据
查看文档
去调试
datadigital.fincloud.generalsaas.ocr.mobile.initialize
OCR端云一体化识别初始化
OpenAPI
OCR端云一体化识别
查看文档
去调试
datadigital.fincloud.generalsaas.face.certify.initialize
初始化人脸认证服务接口
OpenAPI
人脸核身初始化服务,用于创建认证流程。供外部客户使用该项服务。
查看文档
去调试
datadigital.fincloud.generalsaas.face.check.query
人脸检测结果数据查询
OpenAPI
用于查询人脸检测结果的数据。
查看文档
去调试
datadigital.fincloud.generalsaas.face.source.certify
权威核验源的核验接口
OpenAPI
上传人脸照片,调用权威核验源进行验证
查看文档
去调试

本文为大家分享了java实现百度云OCR识别的具体代码,高精度OCR识别身份证信息,供大家参考,具体内容如下

1.通用OCR文字识别

这种OCR只能按照识别图片中的文字,且是按照行识别返回结果,精度较低。

首先引入依赖包:

1
2
3
4
5
<dependency>
  <groupId>com.baidu.aip</groupId>
  <artifactId>java-sdk</artifactId>
  <version>4.6.0</version>
</dependency>

通过OCR工具类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package util;
  
import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;
import java.util.HashMap;
  
  
public class OcrApi {
  private static final String APP_ID = "你的 App ID";
  private static final String API_KEY = "Xb12m5t4jS2n7";
  private static final String SECRET_KEY = "9XVx9GPcSbSUTZ";
  
  private static AipOcr getAipClient() {
    return getAipClient(API_KEY, SECRET_KEY);
  }
  
  public static AipOcr getAipClient(String apiKey, String secretKey) {
    AipOcr client = new AipOcr(APP_ID, apiKey, secretKey);
    // 可选:设置网络连接参数
    client.setConnectionTimeoutInMillis(2000);
    client.setSocketTimeoutInMillis(60000);
    return client;
  }
  
  public static String result(AipOcr client) {
    // 传入可选参数调用接口
    HashMap<String, String> options = new HashMap<>();
    options.put("language_type", "CHN_ENG");
    options.put("detect_direction", "true");
    options.put("detect_language", "true");
    options.put("probability", "true");
  
    JSONObject res = client.basicGeneralUrl(
        "https://lichunyu1234.oss-cn-shanghai.aliyuncs.com/1.png", options);
    return res.toString(2);
  }
  
  public static void main(String[] args) {
    System.out.println(result(getAipClient()));
  }
}

结果如下,识别有两行信息(words即是识别的信息):



2.高精度OCR识别身份证信息 

这种就比较高精度,且按照分类显示,返回数据更友好,高可用。


2.1 接口说明及请求参数是地址官方截图如下:



2.2 OCR身份证识别工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package util;
  
import com.alibaba.druid.util.Base64;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
  
public class OcrUtil {
  // Access_Token获取
  private static final String ACCESS_TOKEN_HOST = "https://aip.baidubce.com/oauth/2.0/token?";
  // 身份证识别请求URL
  private static final String OCR_HOST = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?";
  // apiKey,secretKey
  private static final String API_KEY ="Xb12m5t4jS";
  private static final String SECRET_KEY = "9XVx9GPcSbSUT";
  
  
  // 获取百度云OCR的授权access_token
  public static String getAccessToken() {
    return getAccessToken(API_KEY, SECRET_KEY);
  }
  
  /**
   * 获取百度云OCR的授权access_token
   * @param apiKey
   * @param secretKey
   * @return
   */
  public static String getAccessToken(String apiKey, String secretKey) {
    String accessTokenURL = ACCESS_TOKEN_HOST
        // 1. grant_type为固定参数
        + "grant_type=client_credentials"
        // 2. 官网获取的 API Key
        + "&client_id=" + apiKey
        // 3. 官网获取的 Secret Key
        + "&client_secret=" + secretKey;
  
    try {
      URL url = new URL(accessTokenURL);
      // 打开和URL之间的连接
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("GET");
      connection.connect();
  
      // 获取响应头
      Map<String, List<String>> map = connection.getHeaderFields();
      // 遍历所有的响应头字段
      for (String key : map.keySet()) {
        System.out.println(key + "---->" + map.get(key));
      }
  
      // 定义 BufferedReader输入流来读取URL的响应
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      StringBuilder result = new StringBuilder();
      String inputLine;
      while ((inputLine = bufferedReader.readLine()) != null) {
        result.append(inputLine);
      }
      JSONObject jsonObject = JSONObject.parseObject(result.toString());
      return jsonObject.getString("access_token");
  
    } catch (Exception e) {
      e.printStackTrace();
      System.err.print("获取access_token失败");
    }
    return null;
  }
  
  /**
   * 获取身份证识别后的数据
   * @param imageUrl
   * @param idCardSide
   * @return
   */
  public static String getStringIdentityCard(File imageUrl, String idCardSide) {
    // 身份证OCR的http URL+鉴权token
    String OCRUrl = OCR_HOST+"access_token="+getAccessToken();
    System.out.println(OCRUrl);
    System.out.println("***************************************************");
    System.out.println(getAccessToken());
    // 对图片进行base64处理
    String image = encodeImageToBase64(imageUrl);
    // 请求参数
    String requestParam = "detect_direction=true&id_card_side="+idCardSide+"&image="+image;
  
    try {
      // 请求OCR地址
      URL url = new URL(OCRUrl);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      // 设置请求方法为POST
      connection.setRequestMethod("POST");
  
      // 设置请求头
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      connection.setRequestProperty("apiKey", API_KEY);
      connection.setDoOutput(true);
      connection.getOutputStream().write(requestParam.getBytes(StandardCharsets.UTF_8));
      connection.connect();
  
      // 定义 BufferedReader输入流来读取URL的响应
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
      StringBuilder result = new StringBuilder();
      String inputLine;
      while ((inputLine = bufferedReader.readLine()) != null) {
        result.append(inputLine);
      }
      bufferedReader.close();
      return result.toString();
    } catch (Exception e) {
      e.printStackTrace();
      System.err.println("身份证OCR识别异常");
      return null;
    }
  }
  
  /**
   * 对图片url进行Base64编码处理
   * @param imageUrl
   * @return
   */
  public static String encodeImageToBase64(File imageUrl) {
    // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
    byte[] data = null;
    try {
      InputStream inputStream = new FileInputStream(imageUrl);
      data = new byte[inputStream.available()];
      inputStream.read(data);
      inputStream.close();
  
      // 对字节数组Base64编码
      return URLEncoder.encode(Base64.byteArrayToBase64(data), "UTF-8");
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  
  }
  
  /**
   * 提取OCR识别身份证有效信息
   * @param
   * @return
   */
  public static Map<String, String> getIdCardInfo(MultipartFile image, int idCardSide) {
    String value = getStringIdentityCard(image, idCardSide);
    String side;
    if (idCardSide == 1) {
      side = "正面";
    }else {
      side = "背面";
    }
    Map<String, String> map = new HashMap<>();
    JSONObject jsonObject = JSONObject.parseObject(value);
    JSONObject words_result = jsonObject.getJSONObject("words_result");
    if (words_result == null || words_result.isEmpty()) {
      throw new MyException("请提供身份证"+side+"图片");
    }
    for (String key : words_result.keySet()) {
      JSONObject result = words_result.getJSONObject(key);
      String info = result.getString("words");
      switch (key) {
        case "姓名":
          map.put("name", info);
          break;
        case "性别":
          map.put("sex", info);
          break;
        case "民族":
          map.put("nation", info);
          break;
        case "出生":
          map.put("birthday", info);
          break;
        case "住址":
          map.put("address", info);
          break;
        case "公民身份号码":
          map.put("idNumber", info);
          break;
        case "签发机关":
          map.put("issuedOrganization", info);
          break;
        case "签发日期":
          map.put("issuedAt", info);
          break;
        case "失效日期":
          map.put("expiredAt", info);
          break;
      }
    }
    return map;
  
  }
  
}

官方返回示例:


对于身份证识别有个大坑:

1.有的base64编码后有头部“Base64:”要去掉,阿里巴巴的base64可以正常使用。

2.OCR识别官方只说明图片要Base64编码,但是实际上还是要再UrlEncode再编码一次才可以。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口平台设计(可视化接口管理平台推荐)国内主流开放平台接口有哪些?
下一篇:#yyds干货盘点#k8s集群中容器的数据存储方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~