java实现人脸识别

人脸识别,顾名思义就是刷脸登陆,用户输入用户名,用脸来代替密码进行登陆,就算你是相似度很高的双胞胎也可以正确识别。废话我也不多说了,准备工作大家请往下看:

先看一下做好的截图,界面没有美化,主要是功能,美化界面的花可以弄个高大上的放上去就OK了:

如图:

————————————————————————————————————————————————

——————————————————————————————————————————

登陆的截图:

————————————————————————————————————————————

——————————————————————————————————————————

OK  接下来我们继续往下看:

首先我们创建个数据库:我使用的是sql server,数据库脚本如下:


  
  
  1. USE [ master]
  2. GO
  3. /****** Object: Database [faceDB] Script Date: 2017-09-26 11:18:39 ******/
  4. CREATE DATABASE [faceDB]
  5. CONTAINMENT = NONE
  6. ON PRIMARY
  7. ( NAME = N 'faceDB', FILENAME = N 'E:\DB\faceDB.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
  8. LOG ON
  9. ( NAME = N 'faceDB_log', FILENAME = N 'E:\DB\faceDB_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
  10. GO
  11. ALTER DATABASE [faceDB] SET COMPATIBILITY_LEVEL = 110
  12. GO
  13. IF ( 1 = FULLTEXTSERVICEPROPERTY( 'IsFullTextInstalled'))
  14. begin
  15. EXEC [faceDB].[dbo].[sp_fulltext_database] @ action = 'enable'
  16. end
  17. GO
  18. ALTER DATABASE [faceDB] SET ANSI_NULL_DEFAULT OFF
  19. GO
  20. ALTER DATABASE [faceDB] SET ANSI_NULLS OFF
  21. GO
  22. ALTER DATABASE [faceDB] SET ANSI_PADDING OFF
  23. GO
  24. ALTER DATABASE [faceDB] SET ANSI_WARNINGS OFF
  25. GO
  26. ALTER DATABASE [faceDB] SET ARITHABORT OFF
  27. GO
  28. ALTER DATABASE [faceDB] SET AUTO_CLOSE OFF
  29. GO
  30. ALTER DATABASE [faceDB] SET AUTO_CREATE_STATISTICS ON
  31. GO
  32. ALTER DATABASE [faceDB] SET AUTO_SHRINK OFF
  33. GO
  34. ALTER DATABASE [faceDB] SET AUTO_UPDATE_STATISTICS ON
  35. GO
  36. ALTER DATABASE [faceDB] SET CURSOR_CLOSE_ON_COMMIT OFF
  37. GO
  38. ALTER DATABASE [faceDB] SET CURSOR_DEFAULT GLOBAL
  39. GO
  40. ALTER DATABASE [faceDB] SET CONCAT_NULL_YIELDS_NULL OFF
  41. GO
  42. ALTER DATABASE [faceDB] SET NUMERIC_ROUNDABORT OFF
  43. GO
  44. ALTER DATABASE [faceDB] SET QUOTED_IDENTIFIER OFF
  45. GO
  46. ALTER DATABASE [faceDB] SET RECURSIVE_TRIGGERS OFF
  47. GO
  48. ALTER DATABASE [faceDB] SET DISABLE_BROKER
  49. GO
  50. ALTER DATABASE [faceDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
  51. GO
  52. ALTER DATABASE [faceDB] SET DATE_CORRELATION_OPTIMIZATION OFF
  53. GO
  54. ALTER DATABASE [faceDB] SET TRUSTWORTHY OFF
  55. GO
  56. ALTER DATABASE [faceDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
  57. GO
  58. ALTER DATABASE [faceDB] SET PARAMETERIZATION SIMPLE
  59. GO
  60. ALTER DATABASE [faceDB] SET READ_COMMITTED_SNAPSHOT OFF
  61. GO
  62. ALTER DATABASE [faceDB] SET HONOR_BROKER_PRIORITY OFF
  63. GO
  64. ALTER DATABASE [faceDB] SET RECOVERY FULL
  65. GO
  66. ALTER DATABASE [faceDB] SET MULTI_USER
  67. GO
  68. ALTER DATABASE [faceDB] SET PAGE_VERIFY CHECKSUM
  69. GO
  70. ALTER DATABASE [faceDB] SET DB_CHAINING OFF
  71. GO
  72. ALTER DATABASE [faceDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
  73. GO
  74. ALTER DATABASE [faceDB] SET TARGET_RECOVERY_TIME = 0 SECONDS
  75. GO
  76. EXEC sys.sp_db_vardecimal_storage_format N 'faceDB', N 'ON'
  77. GO
  78. USE [faceDB]
  79. GO
  80. /****** Object: Table [dbo].[users] Script Date: 2017-09-26 11:18:39 ******/
  81. SET ANSI_NULLS ON
  82. GO
  83. SET QUOTED_IDENTIFIER ON
  84. GO
  85. SET ANSI_PADDING ON
  86. GO
  87. CREATE TABLE [dbo].[ users](
  88. [ id] [ int] NOT NULL,
  89. [username] [ varchar]( 50) NOT NULL,
  90. [ password] [ varchar]( 50) NULL,
  91. [headphoto] [ varchar]( 50) NULL,
  92. CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
  93. (
  94. [ id] ASC
  95. ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  96. ) ON [PRIMARY]
  97. GO
  98. SET ANSI_PADDING OFF
  99. GO
  100. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1445236349, N 'muxng', NULL, N '/picture/1506088284547.png')
  101. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1444803643, N 'admin', NULL, N '/picture/1506088717253.png')
  102. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1444707110, N 'adm1', NULL, N '/picture/1506088813786.png')
  103. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1444274083, N '24519om', NULL, N '/picture/1506089246813.png')
  104. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1444264936, N '2450om', NULL, N '/picture/1506089255960.png')
  105. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1444243590, N '123456', NULL, N '/picture/1506089277306.png')
  106. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( -1444184827, N '1234567', NULL, N '/picture/1506089336069.png')
  107. INSERT [dbo].[ users] ([ id], [username], [ password], [headphoto]) VALUES ( 1, N '雄', N '123456', N 'image')
  108. USE [ master]
  109. GO
  110. ALTER DATABASE [faceDB] SET READ_WRITE
  111. 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拿出来亮亮相,以下就是:


  
  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns= "http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <display-name> </display-name>
  8. <servlet>
  9. <servlet-name>FaceServlet </servlet-name>
  10. <servlet-class>org.web.FaceServlet </servlet-class>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>FaceServlet </servlet-name>
  14. <url-pattern>/FaceServlet </url-pattern>
  15. </servlet-mapping>
  16. <welcome-file-list>
  17. <welcome-file>index.jsp </welcome-file>
  18. </welcome-file-list>
  19. </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中,将这段代码:


  
  
  1. // 支持浏览器 谷歌,火狐,360,欧朋
  2. //navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow
  3. if (navigator.getUserMedia) {
  4. navigator.getUserMedia(videoObj, function (stream) {
  5. video.src = stream;
  6. video.play();
  7. }, errBack);
  8. } else if (navigator.webkitGetUserMedia) {
  9. navigator.webkitGetUserMedia(videoObj, function (stream) {
  10. video.src = window.URL.createObjectURL(stream);
  11. video.play();
  12. }, errBack);
  13. } else if (navigator.mozGetUserMedia){
  14. navigator.mozGetUserMedia(videoObj, function (stream) {
  15. video.src = window.URL.createObjectURL(stream);
  16. video.play();
  17. }, errBack);
  18. }

替换成:


  
  
  1. // 支持浏览器 谷歌,火狐,360,欧朋
  2. //navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow
  3. if (navigator.getUserMedia) {
  4. navigator.getUserMedia(videoObj, function (stream) {
  5. //谷歌
  6. MediaStreamTrack= typeof stream.stop=== 'function'?stream:stream.getTracks()[ 1];
  7. video.src=( window.URL).createObjectURL(stream);
  8. video.play();
  9. }, errBack);
  10. } else if (navigator.webkitGetUserMedia) {
  11. //360
  12. navigator.webkitGetUserMedia(videoObj, function (stream) {
  13. MediaStreamTrack=stream.getTracks()[ 1];
  14. video.src=( window.webkitURL).createObjectURL(stream);
  15. video.play();
  16. }, errBack);
  17. } else if (navigator.mozGetUserMedia){
  18. //火狐
  19. navigator.mozGetUserMedia(videoObj, function (stream) {
  20. video.src = window.URL.createObjectURL(stream); 15715377670
  21. video.play();
  22. }, errBack);
  23. }

替换完成即可,其他的不要乱动,可能360和谷歌浏览器默认是禁用摄像头的,先看360浏览器的,点击一下上面的这个标志:

然后:

一定要选第一个,我当时默认的是选择的第二个,捣鼓了很久很久。

谷歌浏览器中:

然后设置成第一个:

注意:360,谷歌或者火狐。在调用摄像头的时候不要同时调用,否则会失效的!!!

——————————————————2018.05.27更新———————————————————————

更新内容:新增活体检测识别,详细请前往: 人脸识别活体检测测试案例

——————————————————2018.06.23更新———————————————————————

更新内容:活体检测之张张嘴和眨眨眼源码:人脸识别活体检测之眨眨眼和张张嘴

 
 

猜你喜欢

转载自blog.csdn.net/lida1234567/article/details/82793387