欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于javaweb调用百度接口实现人脸识别登陆功能

程序员文章站 2022-05-22 10:19:14
...

    百度开放平台有很多新鲜的玩法,有人脸识别,文字识别,图像识别,,,各种各样的接口,忍不住注册了一个玩玩。

基于javaweb调用百度接口实现人脸识别登陆功能

注册一个百度开发者账号,然后就可以‘折腾’了~

拿人脸识别作为例子,可以先注册个人脸识别程序体验一把……

基于javaweb调用百度接口实现人脸识别登陆功能

我们点击“创建应用”,就可以创建一个人脸识别的应用。

随后会出来几串数字和英文字母。千万保存好它,稍后会用到。

基于javaweb调用百度接口实现人脸识别登陆功能

在然后,我们就需要查看文档,每个语言都有对应的文档描述,使用方法和sdk下载,非常全面,如图:

基于javaweb调用百度接口实现人脸识别登陆功能

不用我去介绍了,下面是咱使用javaweb最简单的jsp-servlet弄出来的一个人脸识别登陆的小程序。

页面和servlet:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>人脸识别登陆</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<link rel="stylesheet" type="text/css" href="plugin/css/bootstrap.min.css">
	<link rel="stylesheet" type="text/css" href="plugin/css/font-awesome.min.css">
	<style>
		.hint{
			color:red;
		}
	</style>
  </head>
  <body>
<div class="container">
	<h3>欢迎使用人脸识别签到系统</h3>
	<video width="400" height="300"></video>
	<!-- 图像画布 -->
	<canvas width="200" height="150"></canvas>
	<button id="upload" onclick="DT_register()" class="btn btn-info"><i class="icon-play"></i>&nbsp;登录</button>
	<!-- <button id="snap" class="btn btn-success"><i class="icon-camera"></i>&nbsp;拍个照pian</button> -->
	<a href="jsp/DT/DT_register.jsp" class="btn btn-success"><i class="icon-user"></i>&nbsp;注册新用户</a>
	<a href="servlet/DTAdmin" class="btn btn-warning"><i class="icon-edit"></i>&nbsp;管理人脸库信息</a>
	<button onclick="window.history.back(-1)" class="button button-glow button-border button-rounded button-royal"><i class="icon-reply"></i>&nbsp;返回</button><br/>
	<span class="hint">1.请将面部置于识别区域主体,单击拍照签到<br/>2.每次有且仅能有一个用户使用人脸登录<br/>3.单击登录后请稍候一些时间,程序会将结果返回出来</span>	
</div>
<script>
  function $(elem){
    return document.querySelector(elem);
  }
 //获取元素
  var canvas = $('canvas'),
    context = canvas.getContext('2d'),
    video = $('video'),
    snap = $('#snap'),
    close = $('#close'),
    upload = $('#upload'),
    uploaded = $('#uploaded'),
    mediaStreamTrack;
  //打开摄像头
  if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({
      video: true,
    }).then(function(stream) {
      mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];
      video.src = (window.URL || window.webkitURL).createObjectURL(stream);
      video.play();
    });
  }else if (navigator.getMedia) {
    navigator.getMedia({
      video: true
    }, function(stream) {
      mediaStreamTrack = stream.getTracks()[0];
      video.src = (window.URL || window.webkitURL).createObjectURL(stream);
      video.play();
    });
  }
  //人脸注册部分
  function DT_register(){
	  	//画出图像
	  	context.drawImage(video, 0, 0, 200, 150);
	  	//开始通过jQuery传输图片
  		jQuery.post('servlet/DTLogin', {                  //指定发送图片到的servlet
      		snapData: canvas.toDataURL('image/jpg')		//原来这个小括号里是image/png
    	}).done(function(rs) {
        //对结果集进行解析,判断是否存在人脸
     	if(rs == "noface"){
     		alert("没有人脸信息或人脸数量非1,请重新拍照!");
      	}else if(rs == "nouser"){
      		alert("人脸库中没有您的注册记录!请先注册!");
      	}else if(rs == "picture"){
      		alert("请使用真实的人脸信息进行登录!不得伪造!");
      	}else{
      		alert("成功登录!即将跳转");
      		//路径跳转时,本机测试需要详细路径jsp/DT/部署则不需要,直接写文件名,这点尤为注意
      		window.location.href = "jsp/DT/DT_user.jsp";
      	}
   		});
  }
  // 截取图像
//  snap.addEventListener('click', function() {}, false);
  // 关闭摄像头
/*   close.addEventListener('click', function() {
    mediaStreamTrack && mediaStreamTrack.stop();
  }, false); */
</script>
<script type="text/javascript" src="plugin/js/bootstrap.min.js"></script>
<script type="text/javascript" src="plugin/js/jquery-3.1.1.min.js"></script>
  </body>
</html>
package com.baiduAI.servlet;
//servlet
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;
import org.json.JSONObject;
import com.baidu.aip.face.AipFace;
import com.baiduAI.aip.AIP;
import com.baiduAI.dao.UserDao;
import com.baiduAI.daoImpl.UserDaoImpl;
import com.baiduAI.model.User;
import com.baiduAI.tool.ChangeEncode;

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public LoginServlet() {super();}
	public void destroy() {super.destroy(); }
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}
/**
 * 用户登录处理servlet
 * 	获取页面
 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//转码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//获取页面请求参数
		String username = URLDecoder.decode(request.getParameter("username"),"utf-8");
		String img =request.getParameter("snapData");
		String data = img.substring(22, img.length());	//图片去base64头
		System.out.println("用户名:" + username);
		AipFace client = new AipFace(AIP.APP_ID,AIP.API_KEY,AIP.SECRET_KEY);		//创建连接对象
		HashMap<String,String> options = new HashMap<String,String>();	//请求的预制参数,这里我们就选取默认吧【不放置任何参数】
		byte[] by = ChangeEncode.base64ToByte(data);	//将base64转换成二进制数组【需要借助jar包】
		JSONObject res = client.detect(by, options);	//生成结果集并用JSON保存
		int sum = res.getInt("result_num");
		if(sum != 0){
			System.out.println("可以进行下一步操作!");
			//开始执行查找比对方法
			UserDao ud = new UserDaoImpl();
			User sel_user = ud.login(username);	//执行查询对应用户的人脸图片
			//如果所查询用户存在
			if(sel_user.getUsername() != null){
				byte[] by2 = ChangeEncode.base64ToByte(sel_user.getPic1());	//将查询结果进行转换
				System.out.println("该用户图片返回结果:" + sel_user.getPic1());
				byte[][] by_all = new byte[2][];
				by_all[0] = by;
				by_all[1] = by2;
				//byte[下标][图片数组]
				JSONObject respon = client.match(by_all, options);
				System.out.println("返回数量:"+respon.get("result_num"));
				System.out.println("ID:"+respon.get("log_id"));
				JSONArray ja = respon.getJSONArray("result");	//评分结果集
				int score = 0;
				for(int i = 0;i < ja.length();i ++){
//					System.out.println("比对图片1索引"+ja.getJSONObject(i).getInt("index_i"));
//					System.out.println("比对图片2索引"+ja.getJSONObject(i).getInt("index_j"));
					//官方文档说比对分数大于80既是同一个人
					System.out.println("AI比对相似度:"+ja.getJSONObject(i).getDouble("score"));
					score = (int)ja.getJSONObject(i).getDouble("score");
					if(score > 80){
						//是当前用户,提示成功并存入session
						request.getSession().setAttribute("user", sel_user);	//存入用户对象到session
						System.out.println("登录成功!欢迎您:" + sel_user.getUsername());
						out.print("success");
					}else{
						System.out.println("登录失败,您头像与人脸库用户头像不符!");
						out.print("errorface");
					}
				}
			}else{
				System.out.println("用户不存在!无法继续登录");
				out.print("nouser");
			}
		}else{
			System.out.println("照片中不存在人脸,请重新拍照!");
			out.print("error");
		}
	}
	public void init() throws ServletException {}
}

静态连接参数:

package com.baiduAI.aip;
public class AIP {    
    public static final String APP_ID = "";
	public static final String API_KEY = "";
	public static final String SECRET_KEY = "你的";
}

编码转换:

package com.baiduAI.tool;

import org.apache.commons.codec.binary.Base64;

/**
 * 更改编码类
 */
public class ChangeEncode {
	//base64转byte
	public static byte[] base64ToByte(String base64str){
		//这需要引入jar包Commons-codec-1.5.jar
		return Base64.decodeBase64(base64str);
	}
	//byte转base64
	public static String byteToBase64(byte[] b){
		return Base64.encodeBase64String(b);
	}
}

戳下面~

百度人脸识别文档中心

当然能整合一下,本人写的很乱,整合各个工具类后,层次更清晰~咱算是个‘反面教材’了吧。

小伙伴有什么更好的建议,欢迎下面评论。