java通过百度AI开发平台提取身份证图片中的文字信息
废话不多说,直接上代码。。。
IdCardDemo.java
package com.wulss.baidubce; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map; import com.wulss.utils.Base64Util;
import com.wulss.utils.FileUtil;
import com.wulss.utils.HttpUtil; /**
*
* @Descript TODO (身份证图片识别 案例)
* @author yeting
* @date 2019年4月18日
*
*/
public class IdCardDemo { private static final String URL_IDCARD = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";//身份证识别地址
private static final String URL_ACCESSTOKEN = "https://aip.baidubce.com/oauth/2.0/token?"; // 百度AI开发平台 获取token的地址
private static final String API_KEY = "afdH343CAt342YFT7F"; // 百度AI开发平台 获取的 API Key 更新为你注册的
private static final String SECRET_KEY = "js45sdfqRFF65gOd667sd1R7sdr"; // 百度AI开发平台 获取的 Secret Key 更新为你注册的 /**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Securet Key
* @return assess_token 示例:
* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
*/
public static String getAccessToken() {
String getAccessTokenUrl = URL_ACCESSTOKEN
+ "grant_type = client_credentials" // 1. grant_type为固定参数
+ "&client_id = " + API_KEY // 2. 官网获取的 API Key
+ "&client_secret = " + SECRET_KEY; // 3. 官网获取的 Secret Key
String accessToken = "";
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); org.json.JSONObject jsonObject = new org.json.JSONObject(result);
accessToken = jsonObject.getString("access_token");
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return accessToken;
} /**
* 身份证识别请求
* @param side 识别身份证正面 front;识别身份证背面 back;
* @param filePath 图片路径
* @param accessToken 线上环境有过期时间, 客户端可自行缓存,过期后重新获取。
* @return 返回身份证号码
*/
public static String requestIdCard(String side,String filePath,String accessToken) {
String result = ""; try {
//1.请求获取结果
String requestParams = "id_card_side = " + side
+ "&" + URLEncoder.encode("image", "UTF-8")
+ "=" + URLEncoder.encode(Base64Util.encode(FileUtil.readFileByBytes(filePath)), "UTF-8"); result = HttpUtil.post(URL_IDCARD, accessToken, requestParams);//返回json格式的结果
System.out.println(result); // 请求返回结果eg:
// String result =
// "[{\"log_id\": 3812339812321238679, \"words_result_num\": 6,\"direction\": 2, \"image_status\": \"normal\",
// \"words_result\": {
// \"住址\":{\"location\": {\"width\": 123, \"top\": 123, \"height\": 4423, \"left\":1232}, \"words\": \"湖北省咸宁市茶叶巷\"},
// \"出生\": {\"location\":{\"width\": 333, \"top\": 339, \"height\": 2333, \"left\": 3333}, \"words\": \"19191010\"},
// \"姓名\": {\"location\": {\"width\": 133, \"top\": 309, \"height\": 303, \"left\": 2205}, \"words\": \"张三\"},
// \"公民身份号码\":{\"location\": {\"width\": 111, \"top\": 3333, \"height\": 3335, \"left\":333}, \"words\": \"430124191910101234\"},
// \"性别\": {\"location\": {\"width\":222, \"top\": 521, \"height\": 304, \"left\": 2333}, \"words\": \"男\"},
// \"民族\": {\"location\": {\"width\": 111, \"top\": 3333, \"height\": 22,\"left\": 1222}, \"words\": \"汉\"}
// }
// }]"; // <!-- json转换工具 依赖jar包-->
// <dependency>
// <groupId>net.sf.json-lib</groupId>
// <artifactId>json-lib</artifactId>
// <version>2.4</version>
// <classifier>jdk15</classifier>
// </dependency> //2.解析结果
Map<String,String> resultMap = (Map<String,String>)net.sf.json.JSONObject
.toBean(net.sf.json.JSONObject.fromObject(result),Map.class); if(resultMap.get("error_code").equals("110")) {
return requestIdCard(side,filePath,getAccessToken()) ;//重新请求
}else {
String words = "";
if(resultMap.get("image_status") != null && resultMap.get("image_status").equals("normal")) {// 正常
String wordsResults = resultMap.get("words_result");
Map<String,String> wordsResultMap = (Map<String,String>)net.sf.json.JSONObject
.toBean(net.sf.json.JSONObject.fromObject(wordsResults),Map.class); String idCardNums = wordsResultMap.get("公民身份号码");
Map<String,String> idCardNumMap = (Map<String,String>)net.sf.json.JSONObject
.toBean(net.sf.json.JSONObject.fromObject(idCardNums),Map.class);
words = idCardNumMap.get("words");
}
return words;
}
} catch (Exception e) {
e.printStackTrace();
result = e.getMessage();
} return result;
} }
FileUtil.java
package com.wulss.utils;
import java.io.*; /**
* 文件读取工具类
*/
public class FileUtil { /**
* 读取文件内容,作为字符串返回
*/
public static String readFileAsString(String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException(filePath);
} if (file.length() > 1024 * 1024 * 1024) {
throw new IOException("File is too large");
} StringBuilder sb = new StringBuilder((int) (file.length()));
// 创建字节输入流
FileInputStream fis = new FileInputStream(filePath);
// 创建一个长度为10240的Buffer
byte[] bbuf = new byte[10240];
// 用于保存实际读取的字节数
int hasRead = 0;
while ( (hasRead = fis.read(bbuf)) > 0 ) {
sb.append(new String(bbuf, 0, hasRead));
}
fis.close();
return sb.toString();
} /**
* 根据文件路径读取byte[] 数组
*/
public static byte[] readFileByBytes(String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException(filePath);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
BufferedInputStream in = null; try {
in = new BufferedInputStream(new FileInputStream(file));
short bufSize = 1024;
byte[] buffer = new byte[bufSize];
int len1;
while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
bos.write(buffer, 0, len1);
} byte[] var7 = bos.toByteArray();
return var7;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException var14) {
var14.printStackTrace();
} bos.close();
}
}
}
}
Base64Util.java
package com.wulss.utils; /**
* Base64 工具类
*/
public class Base64Util {
private static final char[] ALPHABET;
private static final char last2byte;
private static final char last4byte;
private static final char last6byte;
private static final char lead6byte;
private static final char lead4byte;
private static final char lead2byte;
private static final char[] encodeTable;
private static int[] toInt; static {
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
last2byte = (char)Integer.parseInt("00000011", 2);
last4byte = (char)Integer.parseInt("00001111", 2);
last6byte = (char)Integer.parseInt("00111111", 2);
lead6byte = (char)Integer.parseInt("11111100", 2);
lead4byte = (char)Integer.parseInt("11110000", 2);
lead2byte = (char)Integer.parseInt("11000000", 2);
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', '+', '/' };
Base64Util.toInt = new int[128];
for (int i = 0; i < Base64Util.ALPHABET.length; ++i) {
Base64Util.toInt[Base64Util.ALPHABET[i]] = i;
}
}
public Base64Util() {
} public static String encode(byte[] from) {
StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
int num = 0;
char currentByte = 0; int i;
for (i = 0; i < from.length; ++i) {
for (num %= 8; num < 8; num += 6) {
switch (num) {
case 0:
currentByte = (char) (from[i] & lead6byte);
currentByte = (char) (currentByte >>> 2);
case 1:
case 3:
case 5:
default:
break;
case 2:
currentByte = (char) (from[i] & last6byte);
break;
case 4:
currentByte = (char) (from[i] & last4byte);
currentByte = (char) (currentByte << 2);
if (i + 1 < from.length) {
currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
}
break;
case 6:
currentByte = (char) (from[i] & last2byte);
currentByte = (char) (currentByte << 4);
if (i + 1 < from.length) {
currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
}
} to.append(encodeTable[currentByte]);
}
} if (to.length() % 4 != 0) {
for (i = 4 - to.length() % 4; i > 0; --i) {
to.append("=");
}
} return to.toString();
} public static byte[] decode(final String s) {
final int delta = s.endsWith("==") ? 2 : (s.endsWith("=") ? 1 : 0);
final byte[] buffer = new byte[s.length() * 3 / 4 - delta];
final int mask = 255;
int index = 0;
for (int i = 0; i < s.length(); i += 4) {
final int c0 = Base64Util.toInt[s.charAt(i)];
final int c2 = Base64Util.toInt[s.charAt(i + 1)];
buffer[index++] = (byte)((c0 << 2 | c2 >> 4) & mask);
if (index >= buffer.length) {
return buffer;
}
final int c3 = Base64Util.toInt[s.charAt(i + 2)];
buffer[index++] = (byte)((c2 << 4 | c3 >> 2) & mask);
if (index >= buffer.length) {
return buffer;
}
final int c4 = Base64Util.toInt[s.charAt(i + 3)];
buffer[index++] = (byte)((c3 << 6 | c4) & mask);
}
return buffer;
}
}
HttpUtil.java
package com.wulss.utils; import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map; /**
* http 工具类
*/
public class HttpUtil { public static String post(String requestUrl, String accessToken, String params)
throws Exception {
String contentType = "application/x-www-form-urlencoded";
return HttpUtil.post(requestUrl, accessToken, contentType, params);
} public static String post(String requestUrl, String accessToken, String contentType, String params)
throws Exception {
String encoding = "UTF-8";
if (requestUrl.contains("nlp")) {
encoding = "GBK";
}
return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
} public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
throws Exception {
String url = requestUrl + "?access_token=" + accessToken;
return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
} public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
throws Exception {
URL url = new URL(generalUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
// 设置通用的请求属性
connection.setRequestProperty("Content-Type", contentType);
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setUseCaches(false);
connection.setDoOutput(true);
connection.setDoInput(true); // 得到请求的输出流对象
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.write(params.getBytes(encoding));
out.flush();
out.close(); // 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> headers = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : headers.keySet()) {
System.err.println(key + "--->" + headers.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = null;
in = new BufferedReader(
new InputStreamReader(connection.getInputStream(), encoding));
String result = "";
String getLine;
while ((getLine = in.readLine()) != null) {
result += getLine;
}
in.close();
System.err.println("result:" + result);
return result;
}
}
java通过百度AI开发平台提取身份证图片中的文字信息的更多相关文章
- 百度AI开发平台简介
AIstudio https://aistudio.baidu.com/aistudio/index 关于AI Studio AI Studio是基于百度深度学习平台飞桨的一站式AI开发平台,提供在线 ...
- 基于百度AI开放平台的人脸识别及语音合成
基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...
- 百度AI开放平台- API实战调用
百度AI开放平台- API实战调用 一. 前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...
- python基于百度AI开发文字识别
很多场景都会用到文字识别,比如app或者网站里都会上传身份证等证件以及财务系统识别报销证件等等 第一步,你需要去百度AI里去注册一个账号,然后新建一个文字识别的应用 然后你将得到一个API Key 和 ...
- 调用百度地图开发平台的JavascriptAPI实现将市县位置转换成坐标
最近的项目要做的地图比较多,有的还比较复杂,而地图用到的坐标,上网找json文件更是良莠不齐的.真是让人伤脑筋,后来突然想到了百度地图开发平台,没想到真的有对应的API哦,谢天谢地!!!下面说一下完整 ...
- jQuery:[2]百度地图开发平台实战
jQuery:[2]百度地图开发平台实战 原文链接: http://blog.csdn.net/moniteryao/article/details/51078779 快速开始 开发平台地址 ht ...
- 百度AI开放平台,语音识别,语音合成以及短文本相似度
百度AI开放平台:https://ai.baidu.com/ 语音合成 from aip import AipSpeech APP_ID=" #'你的 App ID' API_KEY=&qu ...
- selenium自动化 | 借助百度AI开放平台识别验证码登录职教云
#通过借助百度AI开放平台识别验证码登录职教云 from PIL import Image from aip import AipOcr import unittest # driver.get(zj ...
- 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统
这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...
随机推荐
- laravel compact的用法
向视图中传递变量 我们在开发web应用当中,通常都不是为了写静态页面而生的,我们需要跟数据打交道,那么这个时候,问题就来了,在一个MVC的框架中,怎么将数据传给视图呢?比如我们要在 ArticleCo ...
- canvas-8searchLight4.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 08-HTML-框架标签
<html> <head> <title>框架标签学习</title> <meta charset="utf-8"/> ...
- js 人民币小写金额转换为大写
function smalltoBIG(n) { var fraction = ['角', '分']; var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', ...
- Spring整合ActiveMq消息队列
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...
- 方向键控制圆球运动(简易)(js)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PhantomJs浏览器下载
下载地址: http://phantomjs.org/download.html 链接:https://pan.baidu.com/s/1g9ZHLm0Fg56LN30CsDu-CA 密码:qhar
- The concurrent snapshot for publication 'xxx' is not available because it has not been fully generated or the Log Reader Agent is not running to activate it
在两台测试服务器部署了复制(发布订阅)后,发现订阅的表一直没有同步过来.重新生成过snapshot ,也重新初始化过订阅,都不能同步数据,后面检查Distributor To Subscriber H ...
- onclick="return function()"的使用情况
根据function的返回值,进行下一步操作,当返回值为true时,进行下一步操作,当返回值为false时,不进行操作. 例如:当在 <a href="url" onclic ...
- 数据库之mysql篇(1)—— 数据库管理系统简介/mysql的安装、配置
说mysql之前,还是先说说数据库. 什么是数据库: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后 ...