百度AI的使用:解析身份证

附百度AI解析身份证接口文档

百度API提供的几个工具类

解析身份证需要百度应用ID(clientId)和百度应用的秘钥(clientSecret)。附官网链接地址

  • https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72        FileUtil工具类
  • https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2         Base64Util工具类
  • https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3         HttpUtil工具类
  • https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3        GsonUtils工具类

package com.test.www;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import com.alibaba.fastjson.JSONObject;
import com.test.util.BaiDu_Base64Util;
import com.test.util.HttpUtil_BaiDu;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.jpay.util.StringUtils;@Controller
@RequestMapping("/upload")
public class upload {private static final Logger logger = LoggerFactory.getLogger(upload.class);//百度解析身份证的接口地址private static String idcardIdentificate = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";//百度解析身份获取token地址private static String authHost = "https://aip.baidubce.com/oauth/2.0/token";//官网获取的 API Keyprivate static String clientId = "***********NquAegus****";//官网获取的 Secret Keyprivate static String clientSecret = "XfPMY5Rgi*************Avsng1yK";/*** 上传图片* @param request* @param response* @param file * @param idCardType   身份证正反面* @param idCard    身份证* @param name         姓名* @param sex           性别* @return         自己组装数据*/@RequestMapping(value = "/upload")@ResponseBodypublic result uploadImage(HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "file", required = false) MultipartFile file,@RequestParam(value = "idCardType", required = true) String idCardType,@RequestParam(value = "idCard", required = true) String idCard,@RequestParam(value = "name", required = true) String name,@RequestParam(value = "sex", required = true) String sex) {if (!file.isEmpty() || StringUtils.isNotBlank(idCardType)) {String fileName = file.getOriginalFilename();String path = null;String imgType = null;imgType = Files.getFileExtension(fileName).toUpperCase();if ("PNG".equals(imgType) || "JPG".equals(imgType) || "BMP".equals(imgType)) {// 验证身份证信息long begin = System.currentTimeMillis();result resultJson = validateIdCard(file,idCardType.equals("front") ? "front" : "back",idCard, name, sex);long end = System.currentTimeMillis();logger.info("==========验证身份证花费时间:" + (end - begin) / 1000 + "s");//判断验证身份证是否成功if (!resultJson.boo) {return resultJson;}// 根路径String realPath = request.getSession().getServletContext().getRealPath("/");// 文件名字String trueFileName = idCard + "_" + idCardType + "." + imgType;SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");String dateString = sdf.format(new Date());// 存放路径String relativePath = "uploads" + File.separator + "idCard" + File.separator+ dateString + File.separator;path = realPath + relativePath;try {// 创建存放的文件File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}path += trueFileName;File f = new File(path);file.transferTo(f);path = URLDecoder.decode(path, "UTF-8");logger.info("图片存放的路径为:" + path);return new result(Boolean.TRUE, relativePath + trueFileName, "上传成功!");} catch (IllegalStateException | IOException e) {logger.error("", e);return new result(Boolean.FALSE, null, "图片上传失败!");}} else {logger.info("图片类型不匹配!");return new result(Boolean.FALSE, null, "图片类型不匹配!");}} else {logger.info("图片为空!");return new result(Boolean.FALSE, null, "图片为空!");}}/*** 验证上传身份证的正确性* * @return*/private result validateIdCard(MultipartFile file, String idCardSide, String idCard,String name, String sex) {String accessToken = getAuth();String result = null;try {byte[] imgData = file.getBytes();String imgStr = BaiDu_Base64Util.encode(imgData);// 识别身份证正面id_card_side=front,识别身份证背面id_card_side=back;String params = "id_card_side=" + idCardSide + "&" + URLEncoder.encode("image", "UTF-8")+ "=" + URLEncoder.encode(imgStr, "UTF-8");result = HttpUtil_BaiDu.post(idcardIdentificate, accessToken, params);JSONObject jsonObject = JSONObject.parseObject(result);// 身份证正面if (idCardSide.equals("front")) {JSONObject wordsResult = jsonObject.getJSONObject("words_result");Map<String, String> resultMap = getMapByFront(wordsResult);logger.info("解析正面的信息为:", resultMap);if (resultMap.isEmpty()) {return new result(Boolean.FALSE, null, "解析正面失败!");}if (StringUtils.isEmpty(resultMap.get("name"))) {return new result(Boolean.FALSE, null, "解析姓名失败!");}if (StringUtils.isEmpty(resultMap.get("sex"))) {return new result(Boolean.FALSE, null, "解析姓别失败!");}if (StringUtils.isEmpty(resultMap.get("card"))) {return new result(Boolean.FALSE, null, "解析证件号码失败!");}if (!resultMap.get("name").equals(name)) {return new result(Boolean.FALSE, null, "姓名不符!");}if (!resultMap.get("sex").equals(sex)) {return new result(Boolean.FALSE, null, "姓别不符!");}if (!resultMap.get("card").equals(idCard)) {return new result(Boolean.FALSE, null, "证件号码不符!");}return new result(Boolean.TRUE, resultMap, "解析正面成功!");} else {// 身份证反面JSONObject wordsResult = jsonObject.getJSONObject("words_result");Map<String, String> resultMap = getMapByBlack(wordsResult);if (resultMap.isEmpty()) {return new result(Boolean.FALSE, null, "解析反面失败!");}if (StringUtils.isBlank(resultMap.get("organization"))) {return new result(Boolean.FALSE, null, "签发机关解析失败!");}if (StringUtils.isBlank(resultMap.get("endDate"))) {return new result(Boolean.FALSE, null, "结束日期解析失败!");}if (StringUtils.isBlank(resultMap.get("beginDate"))) {return new result(Boolean.FALSE, null, "开始时间解析失败!");}SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date endDate = sdf.parse(resultMap.get("endDate"));// 身份证过期if (new Date().after(endDate)) {return new result(Boolean.FALSE, null, "证件已经过期!");} else {return new result(Boolean.TRUE, resultMap, "解析反面成功!");}}} catch (IOException ioe) {ioe.printStackTrace();} catch (Exception e) {e.printStackTrace();}return null;}/*** 解析身份证反面信息* * @param wordsResult* @return*/public static HashMap<String, String> getMapByFront(JSONObject wordsResult) {HashMap<String, String> map = Maps.newHashMap();try {Set<String> set = wordsResult.keySet();Iterator<String> it = set.iterator();while (it.hasNext()) {String key = it.next();JSONObject result = wordsResult.getJSONObject(key);String value = result.getString("words");switch (key) {case "姓名":map.put("name", value);break;case "民族":map.put("nation", value);break;case "住址":map.put("address", value);break;case "公民身份号码":map.put("card", value);break;case "出生":map.put("birth", value);break;case "性别":map.put("sex", value);break;}}} catch (Exception e) {e.printStackTrace();}return map;}/*** 解析身份证反面信息* * @param wordsResult* @return*/public static HashMap<String, String> getMapByBlack(JSONObject wordsResult) {HashMap<String, String> map = new HashMap<String, String>();try {Set<String> set = wordsResult.keySet();Iterator<String> it = set.iterator();while (it.hasNext()) {String key = it.next();JSONObject result = wordsResult.getJSONObject(key);String value = result.getString("words");switch (key) {case "签发机关":map.put("organization", value);break;case "失效日期":map.put("endDate", value);break;case "签发日期":map.put("beginDate", value);}}} catch (Exception e) {e.printStackTrace();}return map;}/*** 获取权限token* * @return 返回示例: { "access_token":*         "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",*         "expires_in": 2592000 }*/public String getAuth() {String auth = getAuth(clientId, clientSecret);if(StringUtils.isEmpty(auth)){return getAuth(clientId, clientSecret);}else{return auth;}}/*** 获取API访问token 该token有一定的有效期,需要自行管理,当失效时需重新获取.* * @param ak - 百度云官网获取的 API Key* @param sk - 百度云官网获取的 Securet Key* @return assess_token 示例:*         "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"*/public String getAuth(String ak, String sk) {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 = JSONObject.parseObject(result);String access_token = jsonObject.getString("access_token");return access_token;} catch (Exception e) {System.err.printf("获取token失败!");e.printStackTrace(System.err);}return null;}/*** 组装结果集*/@SuppressWarnings("unused")class result {private boolean boo = true;private Object result;private String messages;public result(boolean boo, Object result, String messages) {this.boo = boo;this.result = result;this.messages = messages;}}}

百度AI的使用:解析身份证相关推荐

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

    废话不多说,直接上代码... IdCardDemo.java 1 package com.wulss.baidubce; 2 3 import java.io.BufferedReader; 4 im ...

  2. 微信小程序+百度AI OCR二代身份证识别

    微信小程序内虽然有OCR识别功能 但是收费是按次计费的,还是选用了百度ai提供的OCR识别二代身份证. // 上传人面像upFileFront:function(e){let type = e.cur ...

  3. asp身份证识别代码,asp+百度ai实现身份证正反两面识别

    还是昨天那个朋友,让我帮忙写asp实现姓名与身份证的真假查询的那个朋友,今天又让我帮忙写个asp+百度ai实现身份证正反两面识别代码,有了昨天的百度api开发经验后,今天稍作研究就成功了,asp连接百 ...

  4. Python调用百度AI识别身份证

    本文介绍应用百度AI的文字识别功能对身份证进行识别,感兴趣的朋友一起来看看效果吧.    一.安装baidu-aip模块    按win+R打开cmd,在里面输入 pip3 install baidu ...

  5. 实战解析:真实AI场景下,极小目标检测与精度提升 | 百度AI公开课

    主讲人 | 哈利 百度高级研发工程师 量子位整理编辑 | 公众号 QbitAI 目前,各个企业行业在AI落地应用中,常常会遇到极小目标检测问题.在这些AI应用中,都需要在一个大图中精准识别出极小目标, ...

  6. Java使用百度AI实现识别身份证照片信息,根据身份证号码,获取相关个人信息

    Java使用百度AI实现识别身份证照片信息 百度智能云-登录 1.登录百度智能云,选择文字识别,创建相关信息 2.获取APP_ID.API_KEY.SECRET_KEY 核心处理代码 import c ...

  7. Java使用百度AI实现识别图片文字信息、身份证信息

    百度AI识别API http://ai.baidu.com/docs#/OCR-API/top 这个官网里有丰富的识别示例文档.本文以识别身份证信息作为例子讲解 1.首先登录自己的 "百度智 ...

  8. 百度AI身份证识别接口开发

    1.准备工作: 创建应用并勾选身份证识别接口,应用创建见百度AI应用的创建以及AK.SK的获取如下: API Key.Secret Key见应用列表 2.实现代码如下: public static M ...

  9. python百度ai拼接身份证_Python 百度ai身份证接口案例

    调用百度Ai 完成一个学生信息录入的网页小案例 添加图片,身份证信息对号入座 utils.py #encoding:utf-8 import requests import urllib from u ...

最新文章

  1. Matplotlib实例教程(三)折线图 plt.plot()
  2. IE和FireFox中的event事件
  3. mysql 40014无效_Oracle 问题-ORA-14400: 插入的分区关键字未映射到任何分区
  4. Yum 安装 mysql5.7
  5. linux初识到入门_系统
  6. 数据可视化系统在哪些行业中应用
  7. hdu 6155 - Subsequence Count
  8. Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license”
  9. Linux笔记(十二) Linux集群搭建(附带视频详解)
  10. win10系统迁移后系统重装_win10系统迁移超简单!详细步骤解析
  11. photoshop使用笔记-制作古代印章
  12. 从《我要投资》,看藏在“对立面”里的创业正解
  13. C#+Appium+Nunit demo
  14. 语音控制小车运动APP(基于百度语音识别)
  15. PC端的阿里云盘搜索工具
  16. 云时代的IT应用质量管理新动向
  17. html消防产品模版,消防设备项目建议书模板
  18. 智慧物流:车载监控技术下的物流运输车辆智慧化监管
  19. 51单片机:直流电机与步进电机
  20. 到底要不要考项目管理证书?

热门文章

  1. 笔记一(走进java) 2018-04-25
  2. 2018教师职称计算机,关于做好2018年学校教师和实验系列专业技术职务评聘工作的通知...
  3. 车联网系统会和哪些主机厂系统对接?
  4. 金蝶KIS云的采购模块操作手册
  5. sc9832e camera 不能拍RAW图
  6. java服务端开发的好处_用java开发web的优势到底在哪里?
  7. trajectory planning -i https://pypi.tuna.tsinghua.edu.cn/simple export ALL_PROXY=socks5://12333
  8. 美石油管道大亨遭勒索攻击被迫停服,宣布进入区域性紧急状态
  9. Java报时用什么制作_简单实现一个整点报时的软件
  10. java 开发web页面跳转,javaweb页面跳转