失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java通过百度AI开发平台提取身份证图片中的文字信息

java通过百度AI开发平台提取身份证图片中的文字信息

时间:2023-06-26 10:11:53

相关推荐

java通过百度AI开发平台提取身份证图片中的文字信息

废话不多说,直接上代码。。。

IdCardDemo.java

1 package com.wulss.baidubce; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import .HttpURLConnection; 6 import .URL; 7 import .URLEncoder; 8 import java.util.Map; 9 10 import com.wulss.utils.Base64Util; 11 import com.wulss.utils.FileUtil; 12 import com.wulss.utils.HttpUtil; 13 14 /** 15 * 16 * @Descript TODO (身份证图片识别 案例) 17 * @author yeting 18 * @date 4月18日 19 * 20 */ 21 public class IdCardDemo { 22 23private static final String URL_IDCARD = "/rest/2.0/ocr/v1/idcard";//身份证识别地址 24private static final String URL_ACCESSTOKEN = "/oauth/2.0/token?"; // 百度AI开发平台 获取token的地址 25private static final String API_KEY = "afdH343CAt342YFT7F"; // 百度AI开发平台 获取的 API Key 更新为你注册的 26private static final String SECRET_KEY = "js45sdfqRFF65gOd667sd1R7sdr"; // 百度AI开发平台 获取的 Secret Key 更新为你注册的 2728/** 29* 获取API访问token 30* 该token有一定的有效期,需要自行管理,当失效时需重新获取. 31* @param ak - 百度云官网获取的 API Key 32* @param sk - 百度云官网获取的 Securet Key 33* @return assess_token 示例: 34* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" 35*/ 36public static String getAccessToken() { 37 String getAccessTokenUrl = URL_ACCESSTOKEN 38 + "grant_type = client_credentials" // 1. grant_type为固定参数 39 + "&client_id = " + API_KEY // 2. 官网获取的 API Key 40 + "&client_secret = " + SECRET_KEY; // 3. 官网获取的 Secret Key 41 String accessToken = ""; 42 try { 43 URL realUrl = new URL(getAccessTokenUrl); 44 45 // 打开和URL之间的连接 46 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); 47 connection.setRequestMethod("GET"); 48 connection.connect(); 49 50 // 获取所有响应头字段 51 // Map<String, List<String>> map = connection.getHeaderFields(); 52 // 遍历所有的响应头字段 53 // for (String key : map.keySet()) { 54 //System.err.println(key + "--->" + map.get(key)); 55 // } 56 57 // 定义 BufferedReader输入流来读取URL的响应 58 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 59 String result = ""; 60 String line; 61 while ((line = in.readLine()) != null) { 62 result += line; 63 } 64 65 System.err.println("result:" + result); 66 67 org.json.JSONObject jsonObject = new org.json.JSONObject(result); 68 accessToken = jsonObject.getString("access_token"); 69 } catch (Exception e) { 70 System.err.printf("获取token失败!"); 71 e.printStackTrace(System.err); 72 } 73 return accessToken; 74} 7576/** 77* 身份证识别请求 78* @param side 识别身份证正面 front;识别身份证背面 back; 79* @param filePath 图片路径 80* @param accessToken 线上环境有过期时间, 客户端可自行缓存,过期后重新获取。 81* @return 返回身份证号码 82*/ 83public static String requestIdCard(String side,String filePath,String accessToken) { 84 String result = ""; 85 86 try { 87 //1.请求获取结果 88 String requestParams = "id_card_side = " + side 89 + "&" + URLEncoder.encode("image", "UTF-8") 90 + "=" + URLEncoder.encode(Base64Util.encode(FileUtil.readFileByBytes(filePath)), "UTF-8"); 91 92 result = HttpUtil.post(URL_IDCARD, accessToken, requestParams);//返回json格式的结果 93 System.out.println(result); 94 95 // 请求返回结果eg: 96 // String result = 97 // "[{\"log_id\": 3812339812321238679, \"words_result_num\": 6,\"direction\": 2, \"image_status\": \"normal\", 98 // \"words_result\": { 99 // \"住址\":{\"location\": {\"width\": 123, \"top\": 123, \"height\": 4423, \"left\":1232}, \"words\": \"湖北省咸宁市茶叶巷\"},100 // \"出生\": {\"location\":{\"width\": 333, \"top\": 339, \"height\": 2333, \"left\": 3333}, \"words\": \"19191010\"}, 101 // \"姓名\": {\"location\": {\"width\": 133, \"top\": 309, \"height\": 303, \"left\": 2205}, \"words\": \"张三\"},102 // \"公民身份号码\":{\"location\": {\"width\": 111, \"top\": 3333, \"height\": 3335, \"left\":333}, \"words\": \"430124191910101234\"},103 // \"性别\": {\"location\": {\"width\":222, \"top\": 521, \"height\": 304, \"left\": 2333}, \"words\": \"男\"},104 // \"民族\": {\"location\": {\"width\": 111, \"top\": 3333, \"height\": 22,\"left\": 1222}, \"words\": \"汉\"}105 // }106 //}]";107 108 // <!-- json转换工具 依赖jar包-->109 // <dependency>110 //<groupId>net.sf.json-lib</groupId>111 //<artifactId>json-lib</artifactId>112 //<version>2.4</version>113 //<classifier>jdk15</classifier>114 // </dependency>115 116 //2.解析结果117 Map<String,String> resultMap = (Map<String,String>)net.sf.json.JSONObject118 .toBean(net.sf.json.JSONObject.fromObject(result),Map.class);119 120 if(resultMap.get("error_code").equals("110")) {121 return requestIdCard(side,filePath,getAccessToken()) ;//重新请求122 }else {123 String words = "";124 if(resultMap.get("image_status") != null && resultMap.get("image_status").equals("normal")) {// 正常125 String wordsResults = resultMap.get("words_result");126 Map<String,String> wordsResultMap = (Map<String,String>)net.sf.json.JSONObject127 .toBean(net.sf.json.JSONObject.fromObject(wordsResults),Map.class);128 129 String idCardNums = wordsResultMap.get("公民身份号码");130 Map<String,String> idCardNumMap = (Map<String,String>)net.sf.json.JSONObject131 .toBean(net.sf.json.JSONObject.fromObject(idCardNums),Map.class);132 words = idCardNumMap.get("words");133 }134 return words;135 }136 } catch (Exception e) {137 e.printStackTrace();138 result = e.getMessage();139 }140 141 return result;142}143144145 }

FileUtil.java

1 package com.wulss.utils; 2 import java.io.*; 3 4 /** 5 * 文件读取工具类 6 */ 7 public class FileUtil { 8 9/**10* 读取文件内容,作为字符串返回11*/12public static String readFileAsString(String filePath) throws IOException {13 File file = new File(filePath);14 if (!file.exists()) {15 throw new FileNotFoundException(filePath);16 } 17 18 if (file.length() > 1024 * 1024 * 1024) {19 throw new IOException("File is too large");20 } 21 22 StringBuilder sb = new StringBuilder((int) (file.length()));23 // 创建字节输入流 24 FileInputStream fis = new FileInputStream(filePath); 25 // 创建一个长度为10240的Buffer26 byte[] bbuf = new byte[10240]; 27 // 用于保存实际读取的字节数 28 int hasRead = 0; 29 while ( (hasRead = fis.read(bbuf)) > 0 ) { 30 sb.append(new String(bbuf, 0, hasRead)); 31 } 32 fis.close(); 33 return sb.toString();34}35 36/**37* 根据文件路径读取byte[] 数组38*/39public static byte[] readFileByBytes(String filePath) throws IOException {40 File file = new File(filePath);41 if (!file.exists()) {42 throw new FileNotFoundException(filePath);43 } else {44 ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());45 BufferedInputStream in = null;46 47 try {48 in = new BufferedInputStream(new FileInputStream(file));49 short bufSize = 1024;50 byte[] buffer = new byte[bufSize];51 int len1;52 while (-1 != (len1 = in.read(buffer, 0, bufSize))) {53 bos.write(buffer, 0, len1);54 }55 56 byte[] var7 = bos.toByteArray();57 return var7;58 } finally {59 try {60 if (in != null) {61in.close();62 }63 } catch (IOException var14) {64 var14.printStackTrace();65 }66 67 bos.close();68 }69 }70}71 }

Base64Util.java

1 package com.wulss.utils; 2 3 4 5 /** 6 * Base64 工具类 7 */ 8 public class Base64Util { 9private static final char[] ALPHABET; 10private static final char last2byte; 11private static final char last4byte; 12private static final char last6byte; 13private static final char lead6byte; 14private static final char lead4byte; 15private static final char lead2byte; 16private static final char[] encodeTable; 17private static int[] toInt; 1819static { 20 ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); 21 last2byte = (char)Integer.parseInt("00000011", 2); 22 last4byte = (char)Integer.parseInt("00001111", 2); 23 last6byte = (char)Integer.parseInt("00111111", 2); 24 lead6byte = (char)Integer.parseInt("11111100", 2); 25 lead4byte = (char)Integer.parseInt("11110000", 2); 26 lead2byte = (char)Integer.parseInt("11000000", 2); 27 encodeTable = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; 28 Base64Util.toInt = new int[128]; 29 for (int i = 0; i < Base64Util.ALPHABET.length; ++i) { 30 Base64Util.toInt[Base64Util.ALPHABET[i]] = i; 31 } 32} 33public Base64Util() { 34} 35 36public static String encode(byte[] from) { 37 StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3); 38 int num = 0; 39 char currentByte = 0; 40 41 int i; 42 for (i = 0; i < from.length; ++i) { 43 for (num %= 8; num < 8; num += 6) { 44 switch (num) { 45 case 0: 46currentByte = (char) (from[i] & lead6byte); 47currentByte = (char) (currentByte >>> 2); 48 case 1: 49 case 3: 50 case 5: 51 default: 52break; 53 case 2: 54currentByte = (char) (from[i] & last6byte); 55break; 56 case 4: 57currentByte = (char) (from[i] & last4byte); 58currentByte = (char) (currentByte << 2); 59if (i + 1 < from.length) { 60 currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6); 61} 62break; 63 case 6: 64currentByte = (char) (from[i] & last2byte); 65currentByte = (char) (currentByte << 4); 66if (i + 1 < from.length) { 67 currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4); 68} 69 } 70 71 to.append(encodeTable[currentByte]); 72 } 73 } 74 75 if (to.length() % 4 != 0) { 76 for (i = 4 - to.length() % 4; i > 0; --i) { 77 to.append("="); 78 } 79 } 80 81 return to.toString(); 82} 8384public static byte[] decode(final String s) { 85 final int delta = s.endsWith("==") ? 2 : (s.endsWith("=") ? 1 : 0); 86 final byte[] buffer = new byte[s.length() * 3 / 4 - delta]; 87 final int mask = 255; 88 int index = 0; 89 for (int i = 0; i < s.length(); i += 4) { 90 final int c0 = Base64Util.toInt[s.charAt(i)]; 91 final int c2 = Base64Util.toInt[s.charAt(i + 1)]; 92 buffer[index++] = (byte)((c0 << 2 | c2 >> 4) & mask); 93 if (index >= buffer.length) { 94 return buffer; 95 } 96 final int c3 = Base64Util.toInt[s.charAt(i + 2)]; 97 buffer[index++] = (byte)((c2 << 4 | c3 >> 2) & mask); 98 if (index >= buffer.length) { 99 return buffer;100 }101 final int c4 = Base64Util.toInt[s.charAt(i + 3)];102 buffer[index++] = (byte)((c3 << 6 | c4) & mask);103 }104 return buffer;105}106 }

HttpUtil.java

1 package com.wulss.utils; 2 3 4 import java.io.BufferedReader; 5 import java.io.DataOutputStream; 6 import java.io.InputStreamReader; 7 import .HttpURLConnection; 8 import .URL; 9 import java.util.List;10 import java.util.Map;11 12 /**13 * http 工具类14 */15 public class HttpUtil {16 17public static String post(String requestUrl, String accessToken, String params)18 throws Exception {19 String contentType = "application/x-www-form-urlencoded";20 return HttpUtil.post(requestUrl, accessToken, contentType, params);21}22 23public static String post(String requestUrl, String accessToken, String contentType, String params)24 throws Exception {25 String encoding = "UTF-8";26 if (requestUrl.contains("nlp")) {27 encoding = "GBK";28 }29 return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);30}31 32public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)33 throws Exception {34 String url = requestUrl + "?access_token=" + accessToken;35 return HttpUtil.postGeneralUrl(url, contentType, params, encoding);36}37 38public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)39 throws Exception {40 URL url = new URL(generalUrl);41 // 打开和URL之间的连接42 HttpURLConnection connection = (HttpURLConnection) url.openConnection();43 connection.setRequestMethod("POST");44 // 设置通用的请求属性45 connection.setRequestProperty("Content-Type", contentType);46 connection.setRequestProperty("Connection", "Keep-Alive");47 connection.setUseCaches(false);48 connection.setDoOutput(true);49 connection.setDoInput(true);50 51 // 得到请求的输出流对象52 DataOutputStream out = new DataOutputStream(connection.getOutputStream());53 out.write(params.getBytes(encoding));54 out.flush();55 out.close();56 57 // 建立实际的连接58 connection.connect();59 // 获取所有响应头字段60 Map<String, List<String>> headers = connection.getHeaderFields();61 // 遍历所有的响应头字段62 for (String key : headers.keySet()) {63 System.err.println(key + "--->" + headers.get(key));64 }65 // 定义 BufferedReader输入流来读取URL的响应66 BufferedReader in = null;67 in = new BufferedReader(68 new InputStreamReader(connection.getInputStream(), encoding));69 String result = "";70 String getLine;71 while ((getLine = in.readLine()) != null) {72 result += getLine;73 }74 in.close();75 System.err.println("result:" + result);76 return result;77}78 }

如果觉得《java通过百度AI开发平台提取身份证图片中的文字信息》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。