又是一年毕业季,自己转眼间也毕业一年了!!!前段时间帮学妹指导了一个小区人脸识别门禁系统,整个的实现思路在此记录下,感兴趣的可以参考一下。
整个项目沟通后情况如下:
需求功能:
- 人脸录入
- 人脸更新
- 人脸删除
- 人脸搜索
- 数据备份,数据恢复
- 人脸登录
- 登录统计
- 管理员系统登录
- 小区管理
所用技术:按客户掌握的技能采用java、servlet、vue、jquery、js、ajax、boostrap、css、人脸图像处理部分主要采用百度api。
工期:2个星期。
整个项目最终效果:
- 登录模块的实现思路
(一)代码实现
1、用户请求程序登录入口login.html页面;
2、采集摄像头实时人脸数据,每个1秒钟截取摄像头视频一帧画面,将人脸图片数据转换成base64格式发送给后台控制器;
3、控制器接收前台传入的人脸数据,调用具体的人脸搜索服务;
4、后台拼装参数请求百度api接口;
5、后台获取百度api接口响应数据;
6、后台判断该用户人脸数据是否存在远程人脸库且相似度超过80%,则继续查询本地该用户保存的社区信息和用户基本信息并返回,同时记录用户登录记录,最后提示用户登录成功。反之则返回空的用户信息用户登录失败;
(二)代码实现
//截取图片并请求后台隔
package com.face.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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.face.opj.Face;
import com.face.opj.FaceAndGroup;
import com.face.opj.Groups;
import com.face.opj.MsgSearch;
import com.face.opj.ResultObj;
import com.face.service.FaceInfoCrud;
import com.face.service.FaceSearch;
import com.face.service.GroupsInfoCrud;
import com.face.service.LoginInfoCrud;
import com.google.gson.Gson;
import sun.misc.BASE64Decoder;
@WebServlet("/Login")
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
protected 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 b64 = request.getParameter("saveImg");
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(b64);
Gson gson = new Gson();
FaceInfoCrud fc = new FaceInfoCrud();
GroupsInfoCrud gc = new GroupsInfoCrud();
LoginInfoCrud lc = new LoginInfoCrud();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ResultObj ro = new ResultObj("500", "操作失败", null);
Map result = new HashMap<String, Object>();
result.put("groupName", "noInfo");
result.put("name", "noInfo");
result.put("tel", "noInfo");
result.put("addr", "noInfo");
//调用百度人脸接口查询
if(b64!=null) {
MsgSearch msgs = FaceSearch.Search(b);
if(msgs.error_code == 0) {
String userId = msgs.ShowSearched().user_id;
String groupId = msgs.ShowSearched().group_id;
ArrayList<FaceAn