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; } }
AK和SK在百度AI開放平台中 文字識別--應用列表--創建應用 就可以看得到
⑥demo
鏈接:https://pan.baidu.com/s/13n7_SPaQLfSsK-uDhS3CBw 提取碼:vs9g
(個人Api Key、
Secret Key,僅供方便參考着使用,請勿用於其他用途
)
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開放平台直接復制即可
2.4、測試代碼
鏈接:https://pan.baidu.com/s/1iYy4MIDEWel2w6yG5Dhq7g 提取碼:0e7e
(個人App ID、
Api Key、
Secret Key,僅供方便參考着使用,請勿用於其他用途
)
后期完善參數信息