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 }

原文地址:https://www.cnblogs.com/wlxslsb/p/10729295.html

时间: 2024-10-07 01:21:32

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

基于百度AI开放平台的人脸识别及语音合成

基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜值等信息,将信息返回到Web界面进行显示. (2)人脸比对 在Web界面上传两张人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口比对照片信息,返回相似度. (3)语音识别 在Web页面上传语音文件,判断语音文件格式,如果不是wav格式进行转码处理,然后调用平台接口进行识别,

百度AI开放平台- API实战调用

百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-100条左右,不会更多,只会更少.最终的需求是:从这些匹配结果中找到相似度较高的那些条目. 自己编写算法来实现是一个很大的工程,涉及到自然语言处理的一些方面,比较复杂.于是上网搜了搜,发现百度开放平台的自然语言处理可以免费调用,而且每天有10W的调用次数,对我的小项目来说正好满足.但是,在往下翻的时候

百度AI开放平台,共建AI生态

2016年,百度开始把积累多年的人工智能技术全面对外开放,从底端智能云,中间百度大脑,到顶层的DuerOS,百度打造整体人工智能开放生态,旨在帮助企业.业界能够更快速的使用.应用人工智能的技术去发展,为人类带来更好的生活.在此背景下,为了更加全面的了解百度AI开放平台及AI生态,将由百度AI技术生态部产品负责人刘倩为大家介绍百度在人工智能开放平台与开放生态方面的思考.进展以及沉淀. 以下为刘倩老师演讲实录 百度AI开放生态战略的中流砥柱---百度大脑 百度AI开放生态是从底端智能云,中间百度大脑

百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统

这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前国内做AI的,应该就算百度比较超前了. 于是就开始研究吧. 百度AI的网址http://ai.baidu.com/    然后就看百度的UNIT的文档    地址参见 https://ai.baidu.com/docs#/UNIT-v2-download/top UNIT机器人对话API文档.里面的

c# 利用AForge和百度AI开发实时人脸识别

baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是利用AForge打开摄像头,通过摄像头获取到的图像显示在winform窗体中AForge的控件中,利用AForge控件中的NewFrame事件获取要显示的每一帧的图像,获取图像传输到百度AI平台进行人脸检测,并且将检测结果反馈到界面显示的图像中.在这个过程中有两个问题,获取图像上传到百度AI平台进行

解锁普惠AI开发,华为云ModelArts一站式AI开发平台

一.ModelArts服务简介:ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注.大规模分布式训练.自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流.二.ModelArts功能介绍? 数据治理支持数据筛选.标注等数据处理,提供数据集版本管理,特别是深度学习的大数据集,让训练结果可重现.? 分布式集群训练自研的MoXing深度学习框架,比开源算法更高效更易用.? 云边端全面部署支持模型部署到多种生产环境,可部署为云端在

如何提高码农产量,基于java的web快速开发平台之自定义表单开发随笔

老板 :下班前一定写完? 程序猿:可以,下班前能一定给! 第二天早上上班~~~ 老板:这都第二天了,怎么没写完? 程序猿:我还没有下班呢! 哎!程序猿的痛啊 公司上线的项目有不少销售记录表,又是报价单,又是仓储表,还有什么请假单之类的.一开始,还觉得不就一些表单吗,有什么难的.结果,实际进行起来,才发现,字段什么的是不难,难的是整体的架构啊!每张表的架构都不一样,又不能套用,每个控件的布局啊,表格的宽度和高度,都要自己慢慢去试.这样就非常麻烦了,在开发了几张表单之后,我真的是有些难以忍受了. P

零基础学Android开发之Java语言学习02-JAVA开发平台搭建

window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,点击如下下载按钮: 在下载页面中你需要选择接受许可,并根据自己的系统选择对应的版本(每个人的操作系统是不一样的),本文以 Window 64位系统为例: 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了. 安装JDK,安装过程中可以自定

使用百度 AI 进行智能写诗 &amp; 智能春联

注:本博客为博主在 百度 AI 社区 上分享的一篇文章,由于本博主也是作为一个学习者,所以如果文章中存在错误或者不适合的地方还请见谅. 先来一波推荐: 如果你也喜欢开发,欢迎加入百度 AI 开发平台的核心团队,分享自己的 idea,当然也是有福利的,具体信息访问以下链接:[招募令]核心团队在找最优秀的你! .如果不介意的话可以说是我推荐的哟,本博主百度AI社区ID:busyboxs 我为什么要做这个小项目? 要说起我为什么要做这个小项目,其实要从我的学习生涯谈起.我本来是学深度学习图像处理的,所