java实现人脸识别源码【含测试效果图】——Servlet层(FaceServlet)

来源:互联网 发布:知微数据 编辑:程序博客网 时间:2024/05/18 00:23
package org.web;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.PrintWriter;import java.util.Arrays;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.apache.struts2.ServletActionContext;import org.entity.Users;import org.json.JSONObject;import org.service.IUserService;import org.service.impl.UserServiceImpl;import sun.misc.BASE64Decoder;import com.baidu.aip.face.AipFace;public class FaceServlet extends HttpServlet {/** * (非 Javadoc)* <p>Description(描述):get方法,主要调用post </p>* <p>Title: doGet</p>* @param request* @param response* @throws ServletException* @throws IOException* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}/** * (非 Javadoc)* <p>Description(描述):post方法,主要进行业务操作 </p>* <p>Title: doPost</p>* @param request* @param response* @throws ServletException* @throws IOException* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//防止乱码response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String img= request.getParameter("img");//图像数据String username = request.getParameter("username");//用户名String tag= request.getParameter("tag");String APP_ID = "9802974";    String API_KEY = "OVYw5Ok0y9U8n6CfVPYt0wfZ";    String SECRET_KEY = "aCN3lupCarq3rC9G8Rylqz1d36Towp8G";    AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);if(tag.equals("reg")){//注册face(username, img, response,request,client);}else if(tag.endsWith("login")){//登陆login(img, response, username,request,client);}}/** * * @Title: face* @Description: 该方法的主要作用:注册* 1.将base64编码的图片保存* 2.将图片路径保存在数据库里面* 3.将人脸图片识别在人脸库中注册* @param   设定文件  * @return  返回类型:void   * @throws */public void face(String username,String img,HttpServletResponse response,HttpServletRequest request,AipFace client) {Users user = new Users();IUserService userService = new UserServiceImpl();// 图片名称String fileName = System.currentTimeMillis() + ".png";String basePath = request.getSession().getServletContext().getRealPath("picture/");// 往数据库里面插入注册信息user.setId(((Long)System.currentTimeMillis()).intValue());user.setUsername(username);user.setHeadphoto("/picture/" + fileName);userService.save(user);// 往服务器里面上传图片GenerateImage(img, basePath + "/" + fileName);// 给人脸库中加入一个脸boolean flag = facesetAddUser(client, basePath + "/" + fileName,username);try {PrintWriter out = response.getWriter();// 中文乱码,写个英文比较专业 哈哈if (flag == false) {out.print("请把脸放上!!");//请把两脸放上} else {out.print("注册成功!!");  //注册成功}} catch (IOException e) {// TODO 异常执行块!e.printStackTrace();}}/** * * @Title: login* @Description: 该方法的主要作用:登陆* 实现原理:* 1.从前台接收用户名* 2.然后把从前台传过来的图片先上传到服务器* 3.把上传的这张人脸与人脸库中的人脸对应* @param  设定文件  * @return  返回类型:String   * @throws */public void login(String img,HttpServletResponse response,String username,HttpServletRequest request,AipFace client) {// 图片名称String fileName = System.currentTimeMillis() + ".png";String basePath = request.getSession().getServletContext().getRealPath("picture/");// 往服务器里面上传图片GenerateImage(img, basePath + "/" + fileName);response.setContentType("text/html,charset=utf-8;");try {PrintWriter out = response.getWriter();Double result = verifyUser(client, basePath + "/" + fileName,username);if (result > 90) {// 匹配成功out.print("登陆成功");  } else {//匹配失败out.print("登陆失败");}} catch (IOException e) {// TODO 异常执行块!e.printStackTrace();}}/** * * @Title: GenerateImage* @Description: 该方法的主要作用:// 对字节数组字符串进行Base64解码并生成图片* @param  @param imgStr* @param  @param imgFilePath* @param  @return 设定文件  * @return  返回类型:boolean   * @throws */public boolean GenerateImage(String imgStr, String imgFilePath) {if (imgStr == null) // 图像数据为空return false;BASE64Decoder decoder = new BASE64Decoder();try {// Base64解码byte[] bytes = decoder.decodeBuffer(imgStr);for (int i = 0; i < bytes.length; ++i) {if (bytes[i] < 0) {// 调整异常数据bytes[i] += 256;}}// 生成jpeg图片OutputStream out = new FileOutputStream(imgFilePath);out.write(bytes);out.flush();out.close();return true;} catch (Exception e) {e.printStackTrace();return false;}}/**  * @Title: facesetAddUser    * @Description: 该方法的主要作用:人脸注册,给人脸库中注册一个人脸    * @param  @param client 设定文件      * @return  返回类型:void       * @throws     */public boolean facesetAddUser(AipFace client, String path, String username) {// 参数为数据库中注册的人脸HashMap<String, String> options = new HashMap<String, String>();JSONObject res = client.addUser(username, "test_users_info",Arrays.asList("group1", "group2"), path, options); System.out.println(res.toString(2));// {"log_id": 3621903690062422}if (res.keySet().contains("error_code")) {return false;}return true;}/** * * @Title: verifyUser* @Description: 该方法的主要作用:人脸认证* @param  @param client* @param  @param path* @param  @param username* @param  @return 设定文件  * @return  返回类型:Double   * @throws */    public Double verifyUser(AipFace client, String path, String username) {HashMap<String, Object> options = new HashMap<String, Object>(1);options.put("top_num", 5);/*try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO 异常执行块!e.printStackTrace();}*/JSONObject res = client.verifyUser(username,Arrays.asList("group1", "group2"), path, options);Double result = Double.parseDouble(res.getJSONArray("result").get(0).toString());return result;}}

阅读全文
0 0
原创粉丝点击