主要工作:
1、使用Postman工具模拟浏览器发送请求,调用api的人脸检测和人脸搜索
2、根据api文档,封装工具类为jar包,工具类中实现创建图像集合,寻找图片,检测人脸等操作,通过 静态代码块实现从properties配置文件中读取api的key和秘钥以及人脸集合名称
3、导入了fastjson,用于将返回的json字符串转换为json对象
4、通过servlet实现登录注册,通过js调用摄像头,分别根据登录注册按钮使用ajxs执行相应操作
一、技术介绍
1、人脸识别
  1. face_token:当对一张图片进行人脸检测时,会将检测到的人脸记录下来,包括人脸在图片中的位置,用一个系统标识face_token来表示。
    1. 对同一张图片进行多次人脸检测,对同一个人脸会得到不同的face_token。
  2. 人脸集合 faceSet:人脸集合(FaceSet)是用来存储检测到人脸的存储对象。一个FaceSet内face_token是不重复的。
  3. 人脸搜索:采集用户新的人脸,在多个已知身份用户的人脸集合中进行搜索,找出新的人脸属于哪一个已知身份用户。人脸搜索需要调用Search API。
2、接口介绍
使用了旷世公司的face plus plus提供的接口https://www.faceplusplus.com/
postman工具可以模拟浏览器发送请求,提交数据
人脸检测
人脸搜索
二、具体实现
1、根据API接口封装的工具类的使用
工具类
package com.util;import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.logging.Logger;import javax.net.ssl.SSLException;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;public class FaceUtil {/*** 根据传入图片进行人脸检测* @param file 传入的人脸照片* @return 返回人脸照片的facetoken,如果为空说明图片不符合要求* @throws Exception*/public static String detect(File file) throws Exception {byte[] buff = HTTPUtil.getBytesFromFile(file);String url = "https://api-cn.faceplusplus.com/facepp/v3/detect";HashMap<String, byte[]> byteMap = new HashMap<>();byteMap.put("image_file", buff);byte[] bacd = HTTPUtil.post(url, HTTPUtil.map, byteMap);String str = new String(bacd);if(str.indexOf("error_message")!=-1) {return null;}JSONObject obj = JSONObject.parseObject(str);int faceNum=obj.getIntValue("face_num");if(faceNum==1) {//获取facetokenJSONObject face=(JSONObject) ((JSONArray)obj.get("faces")).get(0);String faceToken=face.getString("face_token");return faceToken;}return null;}/*** 查询指定的照片是否在人脸集合faceset中存在* @param faceToken* @return* @throws Exception*/public static boolean search(String faceToken) throws Exception {String url = "https://api-cn.faceplusplus.com/facepp/v3/search";HTTPUtil.map.put("face_token", faceToken);byte[] bacd = HTTPUtil.post(url, HTTPUtil.map, null);String str = new String(bacd);if(str.indexOf("error_message")==-1) {//请求没有错误JSONObject json = JSONObject.parseObject(str);JSONObject thresholds=(JSONObject) json.get("thresholds");Double le5=thresholds.getDouble("1e-5");JSONArray results=(JSONArray) json.get("results");if(results!=null && results.size()>=1) {Double confidence=((JSONObject)results.get(0)).getDouble("confidence");if(confidence>le5) {return true;}}}return false;}   /*** 添加人脸到faceset中* @param face_tokens 要添加的人脸* @return * @throws Exception*/public static boolean addFace(String face_tokens) throws Exception {if(!getDetail()) {//先获取人脸集合,没有集合就创建一个System.out.println("没有获取到指定人脸集合");boolean res=createFaceSet();if(!res) {System.out.println("创建人脸集合出问题了!");return false;}System.out.println("创建人脸集合成功!");}String url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/addface";HTTPUtil.map.put("face_tokens", face_tokens);byte[] bacd = HTTPUtil.post(url, HTTPUtil.map, null);String str = new String(bacd);if(str.indexOf("error_message")!=-1) {return false;}return true;}  /*** 创建一个人脸的集合 FaceSet,用于存储人脸标识 face_token。* @return* @throws Exception*/public static boolean createFaceSet() throws Exception {String url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/create";byte[] bacd = HTTPUtil.post(url, HTTPUtil.map, null);String str = new String(bacd);System.out.println(str);if(str.indexOf("error_message")!=-1) {return false;}System.out.println("创建人脸集合:"+str);return true;}/*** 获取一个faceset* @return* @throws Exception*/public static boolean getDetail() throws Exception {String url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/getdetail";byte[] bacd = HTTPUtil.post(url, HTTPUtil.map, null);String str = new String(bacd);if(str.indexOf("error_message")!=-1) {return false;}return true;}
}

2、测试类
package com.face.test;
import java.io.File;
import com.util.FaceUtil;
public class TestFace {public static void main(String[] args) {//获取到要检测的图片File file=new File("F:\\相册\\微信图片_20201217215617.jpg");try {String faceToken=FaceUtil.detect(file);System.out.println("face_token:"+faceToken);//人脸的检测//添加一个人脸到集合中boolean addFlag=FaceUtil.addFace(faceToken);//人脸的添加System.out.println("添加成功:"+addFlag);boolean flag=FaceUtil.search(faceToken);//人脸的搜索System.out.println("人脸搜索的结果:"+flag);//获取人脸的集合flag=FaceUtil.getDetail();//如果没有该集合,就创建 一个if(!flag) {flag=FaceUtil.createFaceSet();System.out.println("如果没有outer_id为JohnFaceSet的人脸集合,则创建一个新的!");}System.out.println("outer_id为JohnFaceSet的人脸集合:"+flag);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

3、登录功能的实现
步骤分析
servlet:
  • 概念: Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编 写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web 内容。
  • servlet任务
    • 1)读取客户端(浏览器)发送的数据----(接受请求)
    • 2) 处理数据并生成结果----(处理请求)
    • 3)发送HTTP响应到客户端(浏览器)----(给出响应)
package com.face.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.util.FaceUtil;
import com.wln.util.ImageUtils;@WebServlet("/faceController")
//首字母要小写
public class FaceController extends HttpServlet {private static final long serialVersionUID = 1L;/*** 1、接收用户的请求request* 2、处理请求* 3、返回数据给客户端response*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//登录的步骤//1、获取客户上传的图片-上传到指定的文件夹(upimg)File file=ImageUtils.uploadImg(request, "imgData", "upimg");boolean res=false;//2、判断是否包含人脸信息:detecttry {String faceToken=FaceUtil.detect(file);if(faceToken!=null) {//2.1包含人脸//在faceset中查找是否有相似度高的人脸信息searchres=FaceUtil.search(faceToken);//有:登录成功res=true;//没有:登录失败res=false;}else {//2.2不包含:登录失败}//删除照片} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//删除照片file.delete();//数据的返回 response返回数据给客户端 PrintWriter pw=response.getWriter();String msg="{\"success\":"+res+"}";pw.write(msg);pw.close();} }protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

4、注册功能的实现
package com.face.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.util.FaceUtil;
import com.wln.util.ImageUtils;@WebServlet("/faceController")
//首字母要小写
public class FaceController extends HttpServlet {private static final long serialVersionUID = 1L;/*** 1、接收用户的请求request* 2、处理请求* 3、返回数据给客户端response*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//登录的步骤//1、获取客户上传的图片-上传到指定的文件夹(upimg)File file=ImageUtils.uploadImg(request, "imgData", "upimg");boolean res=false;boolean delFlag=true;//2、判断是否包含人脸信息:detecttry {String faceToken=FaceUtil.detect(file);if(faceToken!=null) {//2.1包含人脸//在faceset中查找是否有相似度高的人脸信息searchres=FaceUtil.search(faceToken);//有:登录成功res=true;//没有:登录失败res=false;//判定用户请求的类型String type=request.getParameter("type");if("register".equals(type)) {if(res) {//有,则已经注册过res=false;//删除照片}else {//没有,可以注册,添加facetoken到faceset中res=FaceUtil.addFace(faceToken);//保留照片delFlag=false;}}}else {//2.2不包含:登录失败}//删除照片} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//删除照片if(delFlag) {file.delete();}//数据的返回 response返回数据给客户端 PrintWriter pw=response.getWriter();String msg="{\"success\":"+res+"}";pw.write(msg);pw.close();}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

来自为知笔记(Wiz)

基于人脸识别的登录与注册相关推荐

  1. 基于人脸识别的登录与注册(2)

    我们使用的是已经帮助我们写好的jar包,jar包在最后全部一起发出来 我们现在,需要写一个测试类来先判断 util是否可以正常运行 导入lib包 写test主函数,由于我们的包考虑到代码保密性,部分方 ...

  2. 计算机人脸识别游戏,基于人脸识别游戏登录方法、装置与计算机可读存储介质与流程...

    技术特征: 1.一种基于人脸识别游戏登录方法,其特征在于,包括: 获取安装在游戏空间内的摄像头拍摄所述游戏空间的实时图像: 对所述实时图像进行人脸识别,获取位于所述游戏空间内的用户的人脸信息,并根据所 ...

  3. 2020/11/13·Java·人脸识别一键登录/注册

    Java·人脸识别一键登录/注册 1.eclipse 和 tomcat 服务器的安装与使用 1.1 Eclipse 的安装 1.2 Eclipse 配置 Tomcat 1.3 新建 Web 项目 1. ...

  4. 【Python】基于人脸识别的智能考勤系统(Pyqt5+MySQL+Opencv) [PC端部分-已附源码]

    [Python]基于人脸识别的考勤系统 [PC端部分] 一.项目简介 本项目编程语言Python3.6,编程工具pycharm,其他工具QT Designer.Navicat,表单信息保存在本地MyS ...

  5. 基于人脸识别的门禁系统

    现在将毕业设计做的 基于人脸识别的门禁系统分享在这里,老规矩,点个关注,文末获取源码: 本系统具备的功能: 前台: 学生通过人脸登录: 根据不同的条件 弹框显示: 后台分为教师和管理员: 教师 可以修 ...

  6. 毕设项目-基于人脸识别的高校课堂考勤微信小程序及系统

    基于人脸识别的高校课堂考勤微信小程序及系统 人脸识别.地图定位考勤微信小程序,调用百度云免费人脸识别API实现. 功能简介 教师学生信息管理,课堂考勤信息管理,人脸识别,地图打卡四大模块. 功能模块说 ...

  7. 基于人脸识别的课堂签到管理系统(六)---删除,查询用户组以及人脸的添加,删除,更新

    基于人脸识别的课堂签到管理系统(六)---删除,查询用户组以及人脸的添加,删除 一.用户组操作 1.1 查询用户组 1.2 删除用户组 二.人脸操作 2.1 人脸添加 2.2 人脸更新 2.3 人脸删 ...

  8. 基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别

    基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别 一.前言概述 二.实时时间显示 三.百度AI人脸识别 3.1 获取access_token 3.2 发送请求,通过网络请求方 ...

  9. 高级货!Django实现基于人脸识别的门禁管理系统【源码】

    项目介绍 基于人脸识别的门禁管理系统 (Python+Django+RESTframework+JsonWebToken+Redis+Dlib) 该项目为宿舍门禁系统管理,并额外加入宿舍管理.水电费管 ...

最新文章

  1. oracle - emctl start dbconsole
  2. 数据挖掘竞赛-轴承故障检测训练赛
  3. 和QT零距离接触的意义是什么
  4. Appium+Python移动端(Android)自动化测试环境搭建原来没有那么难!+ 带你实战去
  5. GitHub学习一-本地电脑与GitHub绑定
  6. ICCV 2019 中国论文数量超美国,商汤57篇论文入选!
  7. 15道AI 机器学习笔试题(暂时没有答案)
  8. 正版饥荒服务器怎么弄,饥荒联机版本地服务器如何创建
  9. 2022上半年朋友圈都在传的10本书,找到了
  10. HDU3579 Hello Kiki(CRT非互质)
  11. sqlserver 2000 sp3补丁
  12. 高德w ndows版地图,高德地图API
  13. GEE基础-大影像下载
  14. 教程篇(6.4) 03. 设备注册 ❀ FortiManager ❀ Fortinet 网络安全专家 NSE 5
  15. 基于Matlab的图像分割----边缘检测
  16. 数据库触发器实例讲解
  17. sender通用收发包测试工具
  18. 手把手教你用owncloud搭建属于自己的云盘
  19. 【收藏】最靠谱的笔记本电脑购买指南,让你少走弯路!
  20. 计算机专业就业率最低: 正规军干不过游击队收藏 面对当今的研究生教育——只有无奈我国教育中令人揪心的若干个不等式...

热门文章

  1. 2020 ICPC上海 题解
  2. 05- AndroidQ(10.0) sd卡权限问题 媒体库更新
  3. 慧数汽车纵览:特朗普以关税为名要求德系车企增加在美投资,这招可还行?
  4. Python每日一练(20230510) 石子游戏 VII\VIII\IX
  5. Spring Boot前后端分离之后端开发
  6. 太阳能监控的应用范围
  7. 【计算机网络原理之TCP】
  8. 寻找第K大 --- 牛客网
  9. Spark RDD API详解(一) Map和Reduce
  10. 斗地主单机版V1.5根据正宗的斗地主规则改编的单机游戏简体中文绿色免费版