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;
  }
}

 

相关文章
|
2月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
269 0
|
6月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
426 7
|
17天前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
3月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
137 0
|
3月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
5月前
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
160 6
家政系统源码,java版本
|
5月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
287 23
|
4月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
198 3
|
6月前
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
105 4
|
弹性计算 Java PHP
新手用户注册阿里云账号、实名认证、购买云服务器图文教程参考
对于初次购买阿里云产品的用户来说,第一步要做的是注册账号并完成实名认证,然后才是购买阿里云服务器或者其他云产品,本文为大家以图文形式展示一下新手用户从注册阿里云账号、实名认证到购买云服务器完整详细教程,以供参考。
新手用户注册阿里云账号、实名认证、购买云服务器图文教程参考

热门文章

最新文章