注意:
看完之后如有不懂,请看:关于人脸和指纹识别共同交流方案,也可以关注微信公众号:雄雄的小课堂,回复:人脸识别群获取群号,群内有直接可以运行的源码可供下载,人脸识别所需的软件群内也有!!!
人脸识别,顾名思义就是刷脸登陆,用户输入用户名,用脸来代替密码进行登陆,就算你是相似度很高的双胞胎也可以正确识别。废话我也不多说了,准备工作大家请往下看:
先看一下做好的截图,界面没有美化,主要是功能,美化界面的花可以弄个高大上的放上去就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更新———————————————————————
更新内容:活体检测之张张嘴和眨眨眼源码:人脸识别活体检测之眨眨眼和张张嘴
——————————————————2018.11.18更新———————————————————————
更新内容:关于人脸和指纹识别共同交流方案
——————————————————2019.07.19更新———————————————————————
更新内容:如果打不开摄像头,并且报错:
Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
只需要将此处的代码:
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); }
替换成:
if (navigator.getUserMedia) { navigator.getUserMedia(videoObj, function (stream) { //谷歌 MediaStreamTrack=typeof stream.stop==='function'?stream:stream.getTracks()[1]; try{ video.src=window.URL.createObjectURL(stream); }catch(e){ console.log(e); video.srcObject = stream; } video.play(); }, errBack); }
成功运行,摄像头打开,正常使用!