基于Dlib19.10库和Opencv340库的动态人脸识别的认证识别系统
目录
摘 要 1
1.绪论 2
1.1背景现状 2
1.2 研究意义 3
1.3人脸识别领域算法总概括 3
1.4本章小结 4
2.图像处理与人脸检测 4
2.1图像处理 4
2.1.1图像缩放 4
2.2 Viola-Jones人脸检测算法 12
2.3 本章小结 30
3动态校验与匹配识别 31
3.1 动态校验 31
3.1.1人脸关键点定位 31
3.1.2眨眼和张嘴判定 32
3.1.3 人脸对齐 35
3.2 匹配识别 36
3.3 本章小结 40
4系统软件设计 40
4.1系统架构 41
4.2 系统配置 41
4.3 前端技术 42
4.4 后端技术 43
4.5 JNI技术 46
4.6 运行演示 47
致谢 64
3动态校验与匹配识别
3.1 动态校验
身份认证(即刷脸登录)过程中,为了避免用户利用照片等非本人且非活体来欺骗系统蒙混过关的现象发生,本系统在设计时联合前后端技术对人脸进行动态校验。具体表现为:在刷脸登录时,提示用户做出张嘴和眨眼动作,系统每隔一秒截取实时录像内容进行关键点定位,同时完成张嘴和眨眼动作的判断,前者是为了防止用户切换照片或人体(一秒的时间很短,用户很难进行切换操作,尽管来得及切换,也会因为图像模糊导致关键点定位失败),后者是为了完成活体的校验。
3.1.1人脸关键点定位
Dlib库是一个机器学习的开源库,它提供了丰富的功能模块,包括人脸检测模块、人脸识别模块和人脸关键点定位模块等。其提供的人脸关键点所使用的算法为ERT(ensemble of regression trees)级联回归,也就是基于梯度提高学习的回归树方法[1]。人脸关键点定位可以应用于疲劳检测等领域以及3D姿态估计等。
人脸关键点的定位顺序如图3.1所示。本设计主要分析眨眼状态和张嘴状态,由图可知眼睛部分的关键点序号为36-47,嘴巴部分的关键点序号为48-67。
图3.1 人脸关键点序号图
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML >
<html>
<head>
<title>欢迎界面</title>
<meta charset="utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="js/jquery.min.js"></script>
<link href="js/bootstrap.min.css" rel="stylesheet">
<script src="js/bootstrap.min.js"></script>
<style type="text/css">
*{
margin:0;padding:0;}
html,body{
width:100%;height:100%;}
body{
background:url(img/user.jpg) repeat center;overflow:hidden;}
#title{
clear:both;color:red;text-align:center;font-weight:bold;font-size:40px;}
#select{
clear:both;color:red;text-align:center;font-weight:bold;font-size:25px;}
#warn{
position:absolute;clear:both;color:orange;text-align:center;font-weight:bold;font-size:40px;left:40%;top:40%;}
thead {
color:red;text-align:center;font-weight:bold;font-size:25px;}
tbody {
color:yellow;text-align:center;vertical-align:center;font-size:20px;font-weight:bold;}
tfoot{
font-size:20px;}
a{
text-decoration:none;color:red;text-decoration:underline;}
a:hover {
color: orange;}
a:visited {
color: red;}
p{
color:red;font-weight:bold;font-size:18px;line-height:35px;}
#delall{
background:orange;height:40px;width:100px;border-radius:50px;}
#exit{
background:orange;height:40px;width:100px;border-radius:50px;}
#go{
float:right;width:220px;}
span{
color:white;font-weight:bold;font-size:30px;}
#adm{
text-decoration:underline;color:yellow;}
</style>
</head>
<body>
<%if(session.getAttribute("adusername")!=null){
%>
<div id="go"><span>管理员:</span><span id="adm">${
adusername } </span></div>
<c:if test="${empty pb.u }"><div id="warn">无 用 户 信 息<br><a href="${pageContext.request.contextPath }/FindAllServlet?pageNum=1">返回</a></div></c:if>
<c:if test="${not empty pb.u }">
<div id="title">用 户 信 息 管 理</div>
<div id="select">
<form action="${pageContext.request.contextPath }/SimpleFindServlet" method="post" id="sim">
<select name="field">
<option value="username">按用户名查询</option>
<option value="id">按id查询</option>
</select>
<input type="text" name="msg" id="content">
<button type="button" οnclick="simpleSelect()">查询</button>
<!--<button type="button" οnclick="back()">返回</button> -->
</form>
</div>
<form action="${pageContext.request.contextPath }/DeleteAllServlet" method="post" id="f">
<table class="table table-hover">
<thead>
<tr>
<td> <input type="checkbox" id="main" οnclick="change()"> </td>
<td>用户ID</td>
<td>用户账号</td>
<td>用户密码</td>
<td>照片路径</td>
<td>用户图片</td>
<td>人脸特征</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<c:forEach items="${pb.u }" var="e">
<tr>
<td> <input type="checkbox" name="ck" value="${e.id }"> </td>
<td>${
e.id }</td>
<td>${
e.username }</td>
<td>${
e.password }</td>
<td>${
e.imgsrc }</td>
<td><img alt="${e.username }" src="${e.imgsrc }"></td>
<td>
<c:if test="${empty e.imgprint }">null</c:if>
<c:if test="${not empty e.imgprint }">256字节(隐藏)</c:if>
</td>
<td>
<a href="${pageContext.request.contextPath }/FindByIdServlet?id=${e.id}">编辑</a>
<a href="javascript:void(0)" οnclick="del(${e.id})">删除</a>
</td>
</tr>
</c:forEach>
<tr>
<td><button type="button" id="delall" οnclick="delAll()"><p>删除选中</p></button></td>
<td></td>
<td><a href="${pageContext.request.contextPath }/FindAllServlet?pageNum=1">首 页</a></td>
<td>
<c:if test="${pb.pageNum==1 }">上一页</c:if>
<c:if test="${pb.pageNum!=1 }">
<a href="${pageContext.request.contextPath }/FindAllServlet?pageNum=${pb.pageNum-1 }">上一页</a>
</c:if>
</td>
<td>
<c:if test="${pb.pageNum==pb.totalPage }">下一页</c:if>
<c:if test="${pb.pageNum!=pb.totalPage }">
<a href="${pageContext.request.contextPath }/FindAllServlet?pageNum=${pb.pageNum+1 }">下一页</a>
</c:if>
</td>
<td><a href="${pageContext.request.contextPath }/FindAllServlet?pageNum=${pb.totalPage }">尾 页</a></td>
<td></td>
<td><button type="button" id="exit" οnclick="leave()"><p>注 销</p></button></td>
</tr>
</tbody>
</table>
</form>
</c:if>
<%}else{
%>
<jsp:forward page="logout.jsp"></jsp:forward>
<%} %>
</body>
<script type="text/javascript">
function del(id){
if(id==1){
alert("管理员账户不能删除!");
return false;
}
var flag=window.confirm("确定删除吗?");
if(flag){
window.location.href="${pageContext.request.contextPath}/DeleteByIdServlet?id="+id;
}
}
function change(){
var main=document.getElementById("main");
var flag=main.checked;
var cks=document.getElementsByName("ck");
for(var i=0;i<cks.length;i++){
cks[i].checked=flag;
}
}
function delAll(){
var cks=document.getElementsByName("ck");
var n=false;
for(var i=0;i<cks.length;i++){
if(cks[i].checked){
if(cks[i].value==1){
alert("管理员账号不能删除");
break;
return false;
}
n=true;
}
}
if(n){
var flag=window.confirm("确定删除吗?");
if(flag){
document.getElementById("f").submit();
}
}
}
function simpleSelect(){
if($("#content").val().replace(/\s/ig,'').length>0){
document.getElementById("sim").submit();
}else{
alert("内容不能为空");
return false;
}
}
function leave(){
window.location.href="${pageContext.request.contextPath}/logout.jsp";
}
function back(){
window.location.href="${pageContext.request.contextPath}/FindAllServlet?pageNum=1";
}
</script>
</html>
还没有评论,来说两句吧...