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


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

      IdCardDemo.java

      1 package com.wulss.baidubce;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.InputStreamReader;
      5 import java.net.HttpURLConnection;
      6 import java.net.URL;
      7 import java.net.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 2019年4月18日
     19  *
     20  */
     21 public class IdCardDemo {
     22 
     23     private static final String URL_IDCARD = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";//身份证识别地址
     24     private static final String URL_ACCESSTOKEN = "https://aip.baidubce.com/oauth/2.0/token?"; // 百度AI开发平台 获取token的地址
     25     private static final String API_KEY = "afdH343CAt342YFT7F";    // 百度AI开发平台 获取的 API Key 更新为你注册的
     26     private static final String SECRET_KEY = "js45sdfqRFF65gOd667sd1R7sdr"; // 百度AI开发平台 获取的 Secret Key 更新为你注册的
     27     
     28      /**
     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      */
     36     public 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     }
     75     
     76     /**
     77      * 身份证识别请求
     78      * @param side 识别身份证正面 front;识别身份证背面 back;
     79      * @param filePath 图片路径
     80      * @param accessToken 线上环境有过期时间, 客户端可自行缓存,过期后重新获取。
     81      * @return 返回身份证号码
     82      */
     83     public 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.JSONObject
    118                                 .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.JSONObject
    127                             .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.JSONObject
    131                             .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     }
    143     
    144     
    145 }

      FileUtil.java

     1 package com.wulss.utils;
     2 import java.io.*;
     3 
     4 /**
     5  * 文件读取工具类
     6  */
     7 public class FileUtil {
     8 
     9     /**
    10      * 读取文件内容,作为字符串返回
    11      */
    12     public 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的Buffer
    26         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      */
    39     public 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) {
    61                         in.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 {
      9     private static final char[] ALPHABET;
     10     private static final char last2byte;
     11     private static final char last4byte;
     12     private static final char last6byte;
     13     private static final char lead6byte;
     14     private static final char lead4byte;
     15     private static final char lead2byte;
     16     private static final char[] encodeTable;
     17     private static int[] toInt;
     18     
     19     static {
     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     }
     33     public Base64Util() {
     34     }
     35 
     36     public 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:
     46                         currentByte = (char) (from[i] & lead6byte);
     47                         currentByte = (char) (currentByte >>> 2);
     48                     case 1:
     49                     case 3:
     50                     case 5:
     51                     default:
     52                         break;
     53                     case 2:
     54                         currentByte = (char) (from[i] & last6byte);
     55                         break;
     56                     case 4:
     57                         currentByte = (char) (from[i] & last4byte);
     58                         currentByte = (char) (currentByte << 2);
     59                         if (i + 1 < from.length) {
     60                             currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
     61                         }
     62                         break;
     63                     case 6:
     64                         currentByte = (char) (from[i] & last2byte);
     65                         currentByte = (char) (currentByte << 4);
     66                         if (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     }
     83     
     84     public 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 java.net.HttpURLConnection;
     8 import java.net.URL;
     9 import java.util.List;
    10 import java.util.Map;
    11 
    12 /**
    13  * http 工具类
    14  */
    15 public class HttpUtil {
    16 
    17     public 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 
    23     public 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 
    32     public 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 
    38     public 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 }
  • 相关阅读:
    京东精益敏捷教练分享:敏捷助力产品创新!
    设计规范 | 详解组件控件结构体系
    Axure响应式进阶
    通讯录表设计
    TEST1
    c#练习四单元总结
    窗体控件应用总结(1)
    .NET(c#理解)
    test2-11
    test1-1
  • 原文地址:https://www.cnblogs.com/wlxslsb/p/10729295.html
Copyright © 2020-2023  润新知