人脸识别,顾名思义就是刷脸登陆,用户输入用户名,用脸来代替密码进行登陆,就算你是相似度很高的双胞胎也可以正确识别。废话我也不多说了,准备工作大家请往下看:
先看一下做好的截图,界面没有美化,主要是功能,美化界面的花可以弄个高大上的放上去就OK了:
如图:
————————————————————————————————————————————————
——————————————————————————————————————————
登陆的截图:
————————————————————————————————————————————
——————————————————————————————————————————
OK 接下来我们继续往下看:
首先我们创建个数据库:我使用的是sql server,数据库脚本如下:
-
USE [
master]
-
GO
-
/****** Object: Database [faceDB] Script Date: 2017-09-26 11:18:39 ******/
-
CREATE
DATABASE [faceDB]
-
CONTAINMENT =
NONE
-
ON PRIMARY
-
(
NAME = N
'faceDB', FILENAME = N
'E:\DB\faceDB.mdf' ,
SIZE =
5120KB ,
MAXSIZE =
UNLIMITED, FILEGROWTH =
1024KB )
-
LOG
ON
-
(
NAME = N
'faceDB_log', FILENAME = N
'E:\DB\faceDB_log.ldf' ,
SIZE =
2048KB ,
MAXSIZE =
2048GB , FILEGROWTH =
10%)
-
GO
-
ALTER
DATABASE [faceDB]
SET COMPATIBILITY_LEVEL =
110
-
GO
-
IF (
1 = FULLTEXTSERVICEPROPERTY(
'IsFullTextInstalled'))
-
begin
-
EXEC [faceDB].[dbo].[sp_fulltext_database] @
action =
'enable'
-
end
-
GO
-
ALTER
DATABASE [faceDB]
SET ANSI_NULL_DEFAULT
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET ANSI_NULLS
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET ANSI_PADDING
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET ANSI_WARNINGS
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET ARITHABORT
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET AUTO_CLOSE
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET AUTO_CREATE_STATISTICS
ON
-
GO
-
ALTER
DATABASE [faceDB]
SET AUTO_SHRINK
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET AUTO_UPDATE_STATISTICS
ON
-
GO
-
ALTER
DATABASE [faceDB]
SET CURSOR_CLOSE_ON_COMMIT
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET CURSOR_DEFAULT
GLOBAL
-
GO
-
ALTER
DATABASE [faceDB]
SET CONCAT_NULL_YIELDS_NULL
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET NUMERIC_ROUNDABORT
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET QUOTED_IDENTIFIER
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET RECURSIVE_TRIGGERS
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET DISABLE_BROKER
-
GO
-
ALTER
DATABASE [faceDB]
SET AUTO_UPDATE_STATISTICS_ASYNC
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET DATE_CORRELATION_OPTIMIZATION
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET TRUSTWORTHY
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET ALLOW_SNAPSHOT_ISOLATION
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET PARAMETERIZATION SIMPLE
-
GO
-
ALTER
DATABASE [faceDB]
SET READ_COMMITTED_SNAPSHOT
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET HONOR_BROKER_PRIORITY
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET
RECOVERY
FULL
-
GO
-
ALTER
DATABASE [faceDB]
SET MULTI_USER
-
GO
-
ALTER
DATABASE [faceDB]
SET PAGE_VERIFY
CHECKSUM
-
GO
-
ALTER
DATABASE [faceDB]
SET DB_CHAINING
OFF
-
GO
-
ALTER
DATABASE [faceDB]
SET FILESTREAM( NON_TRANSACTED_ACCESS =
OFF )
-
GO
-
ALTER
DATABASE [faceDB]
SET TARGET_RECOVERY_TIME =
0 SECONDS
-
GO
-
EXEC sys.sp_db_vardecimal_storage_format N
'faceDB', N
'ON'
-
GO
-
USE [faceDB]
-
GO
-
/****** Object: Table [dbo].[users] Script Date: 2017-09-26 11:18:39 ******/
-
SET ANSI_NULLS
ON
-
GO
-
SET QUOTED_IDENTIFIER
ON
-
GO
-
SET ANSI_PADDING
ON
-
GO
-
CREATE
TABLE [dbo].[
users](
-
[
id] [
int]
NOT
NULL,
-
[username] [
varchar](
50)
NOT
NULL,
-
[
password] [
varchar](
50)
NULL,
-
[headphoto] [
varchar](
50)
NULL,
-
CONSTRAINT [PK_users] PRIMARY
KEY CLUSTERED
-
(
-
[
id]
ASC
-
)
WITH (PAD_INDEX =
OFF, STATISTICS_NORECOMPUTE =
OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS =
ON, ALLOW_PAGE_LOCKS =
ON)
ON [PRIMARY]
-
)
ON [PRIMARY]
-
-
GO
-
SET ANSI_PADDING
OFF
-
GO
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1445236349, N
'muxng',
NULL, N
'/picture/1506088284547.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1444803643, N
'admin',
NULL, N
'/picture/1506088717253.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1444707110, N
'adm1',
NULL, N
'/picture/1506088813786.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1444274083, N
'24519om',
NULL, N
'/picture/1506089246813.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1444264936, N
'2450om',
NULL, N
'/picture/1506089255960.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1444243590, N
'123456',
NULL, N
'/picture/1506089277306.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
-1444184827, N
'1234567',
NULL, N
'/picture/1506089336069.png')
-
INSERT [dbo].[
users] ([
id], [username], [
password], [headphoto])
VALUES (
1, N
'雄', N
'123456', N
'image')
-
USE [
master]
-
GO
-
ALTER
DATABASE [faceDB]
SET READ_WRITE
-
GO
下面附带一张表的结构图,有的人可能不是用的sqlserver,用其他数据库的童鞋们只需按照这个格式就可以了!
数据库建好之后我们导入下所用到的jar包,jar包下载地址:点击这里
项目中所用到的js文件下载:点击这里
我们先看看设计思路:
实现思路:
1.前台通过扫描人脸进行注册,注册必填字段:username,password,id,headphoto
2.登陆,分为两种,一种为密码登陆,另一种为人脸登陆
技术分析:
注册:
1.当用户注册时,通过打开本地摄像头提取人的脸部。
2.获取到人脸之后在通过ajax进行提交到Servlet
3.在Servlet里面进行处理(添加到人脸库中),并且将前台ajax传过来的base64图像进行转换成图片,然后上传到服务器中。
4.提交到人脸库的同时,设置编号为注册用户的id
5.注册用户成功。
登陆:
1.用户需要输入登陆的用户名(username)
2.通过本地打开摄像头进行获取人脸的base64图像信息
3.将base64图像信息转换成图片之后在进行与服务器中的人脸进行比对
4.比对成功
以上就是设计思路。由于本案例使用的是纯jdbc+Servlet,所以我们有必要先把web.xml拿出来亮亮相,以下就是:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<web-app version="3.0"
-
xmlns=
"http://java.sun.com/xml/ns/javaee"
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation=
"http://java.sun.com/xml/ns/javaee
-
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
-
<display-name>
</display-name>
-
<servlet>
-
<servlet-name>FaceServlet
</servlet-name>
-
<servlet-class>org.web.FaceServlet
</servlet-class>
-
</servlet>
-
-
<servlet-mapping>
-
<servlet-name>FaceServlet
</servlet-name>
-
<url-pattern>/FaceServlet
</url-pattern>
-
</servlet-mapping>
-
<welcome-file-list>
-
<welcome-file>index.jsp
</welcome-file>
-
</welcome-file-list>
-
</web-app>
最后,我们的脸的图片是放在服务器中的,所以我们先在webroot下面创建一个文件夹picture,所有的人脸图片均放在这里面,如图:
jdk尽量使用1.7的,lib1和lib里面都是jar包,大家可以直接创建一个lib就可以了。
------------------------------------------------------------2017.11.06更新-------------------------------------------------------------------
博文发出之后好多人问我要源码,那我就把源码贴上吧!
java实现人脸识别源码【含测试效果图】——前台页面层(login.jsp)
java实现人脸识别源码【含测试效果图】——前台显示层(index.jsp)
java实现人脸识别源码【含测试效果图】——Servlet层(FaceServlet)
java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)
java实现人脸识别源码【含测试效果图】——Service层(IUserService)
java实现人脸识别源码【含测试效果图】——DaoImpl层(UserDaoImpl)
java实现人脸识别源码【含测试效果图】——DaoImpl层(BaseDaoUtilImpl)
java实现人脸识别源码【含测试效果图】——Dao层(IUserDao)
java实现人脸识别源码【含测试效果图】——Dao层(IBaseDaoUtil)
java实现人脸识别源码【含测试效果图】——Dao层(BaseDao)
java实现人脸识别源码【含测试效果图】——实体类(Users)
——————————————————2018.05.13更新———————————————————————
本次更新内容:打开摄像头在原有的火狐基础上新加360浏览器个谷歌浏览器,IE暂且不支持
在index.js中,将这段代码:
-
// 支持浏览器 谷歌,火狐,360,欧朋
-
//navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow
-
if (navigator.getUserMedia) {
-
navigator.getUserMedia(videoObj,
function (stream) {
-
video.src = stream;
-
video.play();
-
}, errBack);
-
}
else
if (navigator.webkitGetUserMedia) {
-
navigator.webkitGetUserMedia(videoObj,
function (stream) {
-
video.src =
window.URL.createObjectURL(stream);
-
video.play();
-
}, errBack);
-
}
else
if (navigator.mozGetUserMedia){
-
navigator.mozGetUserMedia(videoObj,
function (stream) {
-
video.src =
window.URL.createObjectURL(stream);
-
video.play();
-
}, errBack);
-
}
替换成:
-
// 支持浏览器 谷歌,火狐,360,欧朋
-
//navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow
-
if (navigator.getUserMedia) {
-
navigator.getUserMedia(videoObj,
function (stream) {
-
//谷歌
-
MediaStreamTrack=
typeof stream.stop===
'function'?stream:stream.getTracks()[
1];
-
video.src=(
window.URL).createObjectURL(stream);
-
video.play();
-
}, errBack);
-
}
else
if (navigator.webkitGetUserMedia) {
-
//360
-
navigator.webkitGetUserMedia(videoObj,
function (stream) {
-
MediaStreamTrack=stream.getTracks()[
1];
-
video.src=(
window.webkitURL).createObjectURL(stream);
-
video.play();
-
}, errBack);
-
}
else
if (navigator.mozGetUserMedia){
-
//火狐
-
navigator.mozGetUserMedia(videoObj,
function (stream) {
-
video.src =
window.URL.createObjectURL(stream);
15715377670
-
video.play();
-
}, errBack);
-
}
替换完成即可,其他的不要乱动,可能360和谷歌浏览器默认是禁用摄像头的,先看360浏览器的,点击一下上面的这个标志:
然后:
一定要选第一个,我当时默认的是选择的第二个,捣鼓了很久很久。
谷歌浏览器中:
然后设置成第一个:
注意:360,谷歌或者火狐。在调用摄像头的时候不要同时调用,否则会失效的!!!
——————————————————2018.05.27更新———————————————————————
更新内容:新增活体检测识别,详细请前往: 人脸识别活体检测测试案例
——————————————————2018.06.23更新———————————————————————
更新内容:活体检测之张张嘴和眨眨眼源码:人脸识别活体检测之眨眨眼和张张嘴