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

简介: java实现人脸识别源码【含测试效果图】——Servlet层(FaceServlet)
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;
  }
}

 

相关文章
|
6天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
19 2
|
10天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
26 3
|
15天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
47 3
|
17天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
32 2
|
21天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
24天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
22 5
|
24天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
30天前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
36 1
|
1月前
|
计算机视觉 异构计算
目标检测实战(四):YOLOV4-Tiny 源码训练、测试、验证详细步骤
这篇文章详细介绍了使用YOLOv4-Tiny进行目标检测的实战步骤,包括下载源码和权重文件、配置编译环境、进行简单测试、训练VOC数据集、生成训练文件、准备训练、开始训练以及多GPU训练的步骤。文章还提供了相应的代码示例,帮助读者理解和实践YOLOv4-Tiny模型的训练和测试过程。
113 0
|
1月前
|
分布式计算 Java 大数据
大数据-122 - Flink Time Watermark Java代码测试实现Tumbling Window
大数据-122 - Flink Time Watermark Java代码测试实现Tumbling Window
33 0