本文详细介绍自己如何在JavaWeb项目中通过调用API实现证件识别。

一,Face++使用简介

二,两种方式(图片URL与本地上传)实现证件识别

一,Face++使用简介

Face++旷视人工智能开放平台,核心技术有人脸识别,人体识别,文字识别以及图像识别。具体详情可查看官方网站

首先需要在官方网站上注册,然后在API应用管理创建API Key,便可得到API Key和API Secret。两者是之后调用API的必要请求参数。

具体操作方式也可查看API文档

        
 

API调用原理:使用者向服务器发起HTTP请求,并加上合适的参数,服务器将会对请求进行处理,得到结果将会返回给使用者。

API调用鉴权:帐号下每创建一个应用程序会生成一组对应的API Key和API Secret,用于识别用户是否有权限调用API,所有的API调用必须提供对应的一组API Key和API Secret。

API调用参数:调用每个API需要根据需求传输不同的参数,身份证识别需要的必须参数有API的URL,API Key,API Secret,image_url或image_file或image_base64以及可选参数legality。

API调用提示:为了避免因网络问题而造成的阻塞,建议将API调用放进异步线程里执行。

 

二,两种方式(图片URL与本地上传)实现证件识别

不管是通过URL方式还是通过本地上传,调用API之前首先需要将图片转为字节型数组byte[]。官方给的案例只介绍了通过本地上传,我在其基础上添加了一个函数 'getBytesFromInputStream'实现将输入流转为字节型数组,代码如下。

①通过URL方式

当输入图片URL,点击检测按钮,触发js的click事件,首先根据URL完成修改img标签的背景图片,并将其传给 'readPhoto1' 函数。该函数将URL通过AJAX异步请求传至Controller层,Controller层通过URL首先建立网络连接得到输入流,输入流通过上述代码转为字节型数组,并put至HashMap中作为参数之一。另外两个参数已经是规定好的,这时再调用post函数,得到返回值转为JSON格式返回至 'readPhoto1' 函数,该函数再取值通过id赋值给相应的标签。参考代码如下。

 $("#bg-model4_button2").click(function(){
var photoURL = document.getElementById("bg-model4_input").value;
document.getElementById('bg-model4_img').src = photoURL;
readPhoto1(photoURL);
});
 /*通过URL读取图片*/
function readPhoto1(photoURL){
$.post("readPhotoInfo1.do",{photoURL},function(data){
document.getElementById("name").innerHTML = data.cards[0].name;
document.getElementById("sex").innerHTML = data.cards[0].gender;
document.getElementById("race").innerHTML = data.cards[0].race;
document.getElementById("birthday").innerHTML = data.cards[0].birthday;
document.getElementById("address").innerHTML = data.cards[0].address;
document.getElementById("idcard_num").innerHTML = data.cards[0].id_card_number;
if(data.cards[0].side == "front"){
document.getElementById("admin_side").innerHTML = "人像面";
}else{
document.getElementById("admin_side").innerHTML = "国徽面";
}
document.getElementById("admin_time_used").innerHTML = data.time_used + "ms";
},"json");
}
 private String photoInfo;   //身份证信息

 //根据图片URL读取图片内容信息
@RequestMapping(value="/readPhotoInfo1.do",method=RequestMethod.POST)
public String readPhotoInfo1(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html; charset=utf-8");
//js里通过ajax传递过来的图片URL
String photoURL = request.getParameter("photoURL");
URL photo_url = new URL(photoURL);
HttpURLConnection conn = (HttpURLConnection)photo_url.openConnection();
conn.setConnectTimeout(3*1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
byte[] buff = CertificateRecognition.getBytesFromInputStream(inputStream); //API的地址
String url = "https://api-cn.faceplusplus.com/cardpp/v1/ocridcard";
HashMap<String, String> map = new HashMap<>();
HashMap<String, byte[]> byteMap = new HashMap<>();
map.put("api_key", "你的api_key");
map.put("api_secret", "你的api_secret");
map.put("return_landmark", "1");
map.put("return_attributes", "gender,age,smiling,headpose,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus");
byteMap.put("image_file", buff);
PrintWriter out = response.getWriter(); callPost(url, map, byteMap, out);
out.close();
return null;
}
 //调用CertificateRecognition中的post方法
private void callPost(String url, HashMap<String, String> map, HashMap<String, byte[]> byteMap, PrintWriter pw) {
try{
byte[] bacd = CertificateRecognition.post(url, map, byteMap);
this.photoInfo = new String(bacd);
pw.println(photoInfo);
System.out.println(photoInfo);
}catch (Exception e) {
e.printStackTrace();
}
}

②通过本地上传方式

当选择本地图片,由于绑定js的change事件,首先完成修改img标签的背景图片,这里的js得到的是本地图片的base64编码,并将其传给'readPhoto2'函数。该函数将的base64编码通过AJAX异步请求传至Controller层,Controller层首先需要对图片的base64编码进行截取(前缀data:image/ jpeg; base64,为无效字符串),并调整异常数据,再将其写入本地一个规定的绝对路径。然后同理通过上述代码转为字节型数组,并将其put至HashMap中作为参数之一。这时再调用post函数,得到返回值并转为JSON格式返回至' readPhoto2'函数,该函数再取值通过id赋值给相应的标签。参考代码如下。

 $("#admin_upload_photo").change(function(){
if(window.FileReader){ //chrome,firefox7+,opera,IE10,IE9,IE9也可以用滤镜来实现
oFReader = new FileReader();
oFReader.readAsDataURL(this.files[0]);
oFReader.onload = function (oFREvent) {
document.getElementById('bg-model4_img').src = oFREvent.target.result;
var base64 = oFREvent.target.result;
alert(base64);
readPhoto2(base64);
};
}
});
 /*通过绝对路径读取图片*/
function readPhoto2(base64){
$.post("readPhotoInfo2.do",{base64},function(data){
document.getElementById("name").innerHTML = data.cards[0].name;
document.getElementById("sex").innerHTML = data.cards[0].gender;
document.getElementById("race").innerHTML = data.cards[0].race;
document.getElementById("birthday").innerHTML = data.cards[0].birthday;
document.getElementById("address").innerHTML = data.cards[0].address;
document.getElementById("idcard_num").innerHTML = data.cards[0].id_card_number;
if(data.cards[0].side == "front"){
document.getElementById("admin_side").innerHTML = "人像面";
}else{
document.getElementById("admin_side").innerHTML = "国徽面";
}
document.getElementById("admin_time_used").innerHTML = data.time_used + "ms";
},"json");
}
 //根据图片绝对路径读取图片内容信息
@RequestMapping(value="/readPhotoInfo2.do",method=RequestMethod.POST)
public String readPhotoInfo2(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html; charset=utf-8");
//js里通过ajax传递过来的图片base64编码
String base64 = request.getParameter("base64");
int size = base64.indexOf(","); //截取第一个,号后面的字符串
System.out.println(size); // String substr = base64.substring(22); BASE64Decoder decoder = new BASE64Decoder();
try
{
byte[] b = decoder.decodeBuffer(substr);
for(int i=0;i<b.length;++i) //调整异常数据
{
if(b[i]<0){
b[i] += 256;
}
}
String imgFilePath = "e:/base.png"; //新生成的图片存放路径
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close(); File file = new File(imgFilePath);
byte[] buff = CertificateRecognition.getBytesFromFile(file); //API的地址
String url = "https://api-cn.faceplusplus.com/cardpp/v1/ocridcard";
HashMap<String, String> map = new HashMap<>();
HashMap<String, byte[]> byteMap = new HashMap<>();
map.put("api_key", "你的api_key");
map.put("api_secret", "你的api_secret");
map.put("return_landmark", "1");
map.put("return_attributes", "gender,age,smiling,headpose,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus");
byteMap.put("image_file", buff);
PrintWriter pw = response.getWriter(); callPost(url, map, byteMap, pw);
pw.close(); }
catch (Exception e){
e.printStackTrace();
}
return null;
}

项目效果图如下(证件图片是在网上任意找的一张图片,不针对于任何人)。

如有疏漏错误之处,还请不吝赐教!

通过调用API在JavaWeb项目中实现证件识别的更多相关文章

  1. log4j在javaWeb项目中的使用

    在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等 ...

  2. JavaWeb 项目中的绝对路径和相对路径以及问题的解决方式

    近期在做JavaWeb项目,总是出现各种的路径错误,并且发现不同情况下 /  所代表的含义不同,导致在调试路径上浪费了大量时间. 在JavaWeb项目中尽量使用绝对路径  由于使用绝对路径是绝对不会出 ...

  3. 关联分析FPGrowth算法在JavaWeb项目中的应用

    关联分析(关联挖掘)是指在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品之 ...

  4. Druid使用起步—在javaWeb项目中配置监控 连接池

    当我们在javaWEB项目中使用到druid来作为我们的连接池的时候,一定不会忘了添加监控功能.下面我们就来看一下,在一个简单的web项目中(尚未使用任何框架)我们是如果来配置我们的web.xml来完 ...

  5. JavaWeb项目中web.xml有关servlet的基本配置

    JavaWeb项目中web.xml有关servlet的基本配置: 我们注意到,tomcat下的conf中也有一个web.xml文件,没错的,所有的JavaWeb项目中web.xml都继承自服务器下的w ...

  6. ElasticSearch搜索引擎在JavaWeb项目中的应用

    近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...

  7. Javaweb项目中出现java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.异常

    javaweb项目中java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represent ...

  8. javaweb项目中遇到的一些乱码问题

    在做javaweb项目时,我们经常会遇到一些乱码问题: 首先,确定一点思想:要想不乱码,你要保证编码一致就行了,即统一编码~ 其一,jsp等页面中的中文显示乱码(这里不只是说jsp文件,其它文件也有这 ...

  9. javaweb项目中嵌入webservice--axis2

    由于最近项目中需要搭建webservice服务端,由于原项目是javaweb项目,所以需要整合.之前用cxf试了,启动老是报错,maven依赖冲突.后来索性换成axis2 百度了一圈,下面这个博客 h ...

随机推荐

  1. fast、faster中ap值的计算

    def voc_ap(rec, prec, use_07_metric=False): """ ap = voc_ap(rec, prec, [use_07_metric ...

  2. Struts2学习笔记——Struts2搭建和第一个小程序

    1.新建web项目 2.配置Struts2核心过滤器 (1)打开web.xml文件,做以下配置: <?xml version="1.0" encoding="UTF ...

  3. Cesium.js学习第二天(立方体)

    var viewer = new Cesium.Viewer('cs'); viewer.entities.add({//图标 position: Cesium.Cartesian3.fromDegr ...

  4. 写在归程路上——2018ROBOCUP机器人世界杯中国赛

    写入自强队名单一年,认识Daniel十个月,第二次代表上海大学参加国赛,这一次是在浙江绍兴.坐在返沪的车上,心里担心着作业和明天的早课,写这篇博文来打发打发时间. ROBOCUP两个半比赛日,项目主要 ...

  5. 【洛谷P2447】[SDOI2010]外星千足虫

    外星千足虫 题目链接 首先,它一看题解就是个高斯消元 只是改成了奇偶性的判断 性质: 奇数+奇数=偶数 奇数+偶数=奇数 偶数+奇数=奇数 偶数+偶数=偶数 于是我们用1表示奇数,0表示偶数 1+1= ...

  6. 【题解】洛谷P2341 [HAOI2006]受欢迎的牛(强连通分量)

    洛谷P2341:https://www.luogu.org/problemnew/show/P2341 前言 这题看错题目 足足花了将近5小时提交了15次 在一位dalao的提醒下才AC了 记得要看清 ...

  7. windows mysql密码设置与破解

    1.设置密码 mysqladmin -uroot -p password "1234" 查看当前用户: 2.破解密码 关闭 MySQL 服务 执行 mysqld --skip-gr ...

  8. data-ng-show 指令

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. 22.访问jar包下资源路径里的文件

    访问jar包下资源路径里的文件 因为打包路径和你构建的代码路径是有差异的,想要查看真实的路径情况,可以查看编译后的classes目录下的文件结构. 想要获取资源文件流: private InputSt ...

  10. 史上最简单的 SpringCloud 教程 | 第十四篇: 服务注册(consul)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2017/07/12/sc14-consul/ 本文出自方志朋的博客 这篇文章主要介绍 s ...