1、通过API文档方式实现
1.1、接口描述
支持对二代居民身份证正反面所有8个字段进行结构化识别,包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限,识别准确率超过99%;同时支持身份证正面头像检测,并返回头像切片的base64编码及位置信息。
同时,支持对用户上传的身份证图片进行图像风险和质量检测,可识别图片是否为复印件或临时身份证,是否被翻拍或编辑,是否存在正反颠倒、模糊、欠曝、过曝等质量问题。
1.2、增值功能
增值能力 | 详情 |
裁剪能力 | 头像检测与切片:返回头像切片的base64编码及位置信息 |
质量检测 | 身份证图片模糊检测 |
身份证关键字段反光或过曝光 | |
身份证图片较暗或欠曝光 | |
风险检测 | 身份证复印件告警 |
临时身份证告警 | |
身份证翻拍告警 | |
身份证PS编辑告警 | |
身份证证号不合法告警 | |
身份证证号和姓名、出生日期、性别信息不一致告警 |
1.3.1、请求说明
HTTP 方法:POST
请求URL:
https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
请求参数:
①URL参数
参数 | 值 |
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
②Header部分参数
参数 | 值 |
Content-Type | application/x-www-form-urlencoded |
③body部分参数
参数 | 是否必选 | 类型 | 可选值范围 | 说明 |
image | 和url二选一 | string | - | 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式 |
url | 和image二选一 | string | - | 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效 请注意关闭URL防盗链 |
id_card_side | 是 | string | front/back | -front:身份证含照片的一面 -back:身份证带国徽的一面 自动检测身份证正反面,如果传参指定方向与图片相反,支持正常识别,返回参数image_status字段为"reversed_side" |
detect_direction | 否 | string | - | 此参数新版本无需传,支持自动检测图像旋转角度 |
detect_risk | 否 | string | true/false | 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,默认不开启,即:false。 -true:开启,请查看返回参数risk_type; -false:不开启 |
detect_photo | 否 | string | true/false | 是否检测头像内容,默认不检测。可选值:true-检测头像并返回头像的 base64 编码及位置信息 |
detect_rectify | 否 | string | - | 此参数新版本无需传,支持自动校验图片完整性,可识别完整和切片身份证 |
④请求代码demo
package com.baidu.ai.aip; import com.baidu.ai.aip.utils.Base64Util; import com.baidu.ai.aip.utils.FileUtil; import com.baidu.ai.aip.utils.HttpUtil; import java.net.URLEncoder; /** * 身份证识别 */ public class Idcard { /** * 重要提示代码中所需工具类 * FileUtil,Base64Util,HttpUtil,GsonUtils请从 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下载 */ public static String idcard() { // 请求url String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"; try { // 本地文件路径 String filePath = "[本地文件路径]"; byte[] imgData = FileUtil.readFileByBytes(filePath); String imgStr = Base64Util.encode(imgData); String imgParam = URLEncoder.encode(imgStr, "UTF-8"); String param = "id_card_side=" + "front" + "&image=" + imgParam; // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = "[调用鉴权接口获取的token]"; String result = HttpUtil.post(url, accessToken, param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { Idcard.idcard(); } }
⑤返回参数说明
字段 | 是否必选 | 类型 | 说明 |
direction | 否 | int32 | 图像方向,当图像旋转时,返回该参数。 - -1:未定义, - 0:正向, - 1: 逆时针90度, - 2:逆时针180度, - 3:逆时针270度 |
image_status | 是 | string | normal-识别正常 reversed_side-身份证正反面颠倒 non_idcard-上传的图片中不包含身份证 blurred-身份证模糊 other_type_card-其他类型证照 over_exposure-身份证关键字段反光或过曝 over_dark-身份证欠曝(亮度过低) unknown-未知状态 |
risk_type | 否 | string | 输入参数 detect_risk = true 时,则返回该字段识别身份证类型: normal-正常身份证;copy-复印件;temporary-临时身份证;screen-翻拍;unknown-其他未知情况 |
edit_tool | 否 | string | 如果参数 detect_risk = true 时,则返回此字段。如果检测身份证被编辑过,该字段指定编辑软件名称,如:Adobe Photoshop CC 2014 (Macintosh),如果没有被编辑过则返回值无此参数 |
log_id | 是 | uint64 | 唯一的log id,用于问题定位 |
photo | 否 | string | 当请求参数 detect_photo = true时返回,头像切图的 base64 编码(无编码头,需自行处理) |
photo_location | 否 | array() | 当请求参数 detect_photo = true时返回,头像的位置信息(坐标0点为左上角) |
idcard_number_type | 是 | string | 用于校验身份证号码、性别、出生是否一致,输出结果及其对应关系如下: -1: 身份证正面所有字段全为空 0: 身份证证号不合法,此情况下不返回身份证证号 1: 身份证证号和性别、出生信息一致 2: 身份证证号和性别、出生信息都不一致 3: 身份证证号和出生信息不一致 4: 身份证证号和性别信息不一致 |
words_result | 是 | array() | 定位和识别结果数组 |
words_result_num | 是 | uint32 | 识别结果数,表示words_result的元素个数 |
+location | 是 | array() | 位置数组(坐标0点为左上角) |
++left | 是 | uint32 | 表示定位位置的长方形左上顶点的水平坐标 |
++top | 是 | uint32 | 表示定位位置的长方形左上顶点的垂直坐标 |
++width | 是 | uint32 | 表示定位位置的长方形的宽度 |
++height | 是 | uint32 | 表示定位位置的长方形的高度 |
+words | 否 | string | 识别结果字符串 |
⑥返回结果demo
{ "words_result": { "姓名": { "words": "张三", "location": { "top": 447, "left": 235, "width": 135, "height": 46 } }, "民族": { "words": "汉", "location": { "top": 529, "left": 434, "width": 28, "height": 39 } }, "住址": { "words": "甘肃省甘谷县XXXXX", "location": { "top": 676, "left": 235, "width": 383, "height": 88 } }, "公民身份号码": { "words": "6205XXXXXXXXXXXXXXX", "location": { "top": 860, "left": 382, "width": 503, "height": 48 } }, "出生": { "words": "199XXXX", "location": { "top": 600, "left": 232, "width": 309, "height": 39 } }, "性别": { "words": "男", "location": { "top": 527, "left": 235, "width": 33, "height": 41 } } }, "log_id": 1362745221229576598, "words_result_num": 6, "idcard_number_type": 1, "image_status": "normal" }
1.3.2、请求代码
①代码结构
②需要下载的几个工具类
FileUtil,Base64Util,HttpUtil,GsonUtils https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
③需要导入的包
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency> </dependencies>
④主方法class
package com.baidu.ai.aip; import com.baidu.ai.aip.utils.Base64Util; import com.baidu.ai.aip.utils.FileUtil; import com.baidu.ai.aip.utils.HttpUtil; import java.net.URLEncoder; /** * 身份证识别 */ public class Idcard { /** * 重要提示代码中所需工具类 * FileUtil,Base64Util,HttpUtil,GsonUtils请从 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下载 */ public static String idcard() { // 请求url String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"; try { // 本地文件路径 String filePath = "[本地文件路径]"; byte[] imgData = FileUtil.readFileByBytes(filePath); String imgStr = Base64Util.encode(imgData); String imgParam = URLEncoder.encode(imgStr, "UTF-8"); String param = "id_card_side=" + "front" + "&image=" + imgParam; // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = "[调用鉴权接口获取的token]"; String result = HttpUtil.post(url, accessToken, param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { Idcard.idcard(); } }
图片路径、front/back为身份证的正反面,token的获取需要在别的一个工具类中获取AuthService中获取,调用AuthService中的
getAuth返回token
⑤AuthService类
package com.baidu.ai.aip.auth; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * 获取token类 */ public class AuthService { /** * 获取权限token * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ public static String getAuth() { // 官网获取的 API Key 更新为你注册的 String clientId = "百度云应用的AK"; // 官网获取的 Secret Key 更新为你注册的 String clientSecret = "百度云应用的SK"; return getAuth(clientId, clientSecret); } /** * 获取API访问token * 该token有一定的有效期,需要自行管理,当失效时需重新获取. * @param ak - 百度云官网获取的 API Key * @param sk - 百度云官网获取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String getAuth(String ak, String sk) { // 获取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost // 1. grant_type为固定参数 + "grant_type=client_credentials" // 2. 官网获取的 API Key + "&client_id=" + ak // 3. 官网获取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 打开和URL之间的连接 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.err.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } /** * 返回结果示例 */ System.err.println("result:" + result); JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("获取token失败!"); e.printStackTrace(System.err); } return null; } }
<strong>AK和SK在百度AI开放平台中 文字识别--应用列表--创建应用 就可以看得到<br><img src="https://img2020.cnblogs.com/blog/1035234/202102/1035234-20210219213057347-369520936.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto" class="medium-zoom-image"></strong>
⑥demo
链接:https://pan.baidu.com/s/13n7_SPaQLfSsK-uDhS3CBw 提取码:vs9g
2、通过SDK文档方式实现
2.1、OCR Java SDK目录结构
com.baidu.aip ├── auth //签名相关类 ├── http //Http通信相关类 ├── client //公用类 ├── exception //exception类 ├── ocr │ └── AipOcr //AipOcr类 └── util //工具类
2.2、依赖的包
<dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>${version}</version> </dependency>
2.3、测试demo
public class Sample { //设置APPID/AK/SK public static final String APP_ID = "你的 App ID"; public static final String API_KEY = "你的 Api Key"; public static final String SECRET_KEY = "你的 Secret Key"; public static void main(String[] args) { // 初始化一个AipOcr AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY); // 可选:设置网络连接参数 client.setConnectionTimeoutInMillis(2000); client.setSocketTimeoutInMillis(60000); // 可选:设置代理服务器地址, http和socket二选一,或者均不设置 client.setHttpProxy("proxy_host", proxy_port); // 设置http代理 client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理 // 可选:设置log4j日志输出格式,若不设置,则使用默认配置 // 也可以直接通过jvm启动参数设置此环境变量 System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties"); // 调用接口 String path = "test.jpg"; JSONObject res = client.basicGeneral(path, new HashMap<String, String>()); System.out.println(res.toString(2)); } }
这几个参数在百度AI开放平台直接复制即可
<strong><img src="https://img2020.cnblogs.com/blog/1035234/202102/1035234-20210219213057347-369520936.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto" class="medium-zoom-image"></strong>
2.4、测试代码
链接:https://pan.baidu.com/s/1iYy4MIDEWel2w6yG5Dhq7g 提取码:0e7e (个人 App ID、Api Key、Secret Key,仅供方便参考着使用,请勿用于其他用途)