java实现人脸识别源码【含测试效果图】——前期准备工作及访问提示
注意:
看完之后如有不懂,请看:关于人脸和指纹识别共同交流方案,也可以关注微信公众号:雄雄的小课堂,回复:人脸识别群获取群号,群内有直接可以运行的源码可供下载,人脸识别所需的软件群内也有!!!
人脸识别,顾名思义就是刷脸登陆,用户输入用户名,用脸来代替密码进行登陆,就算你是相似度很高的双胞胎也可以正确识别。废话我也不多说了,准备工作大家请往下看:
先看一下做好的截图,界面没有美化,主要是功能,美化界面的花可以弄个高大上的放上去就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);
}
成功运行,摄像头打开,正常使用!