java基于springboot的人脸识别企业排班考勤系统之人脸识别模块的设计和实现
項(xiàng)目里考勤打卡需要換成人臉識別,主要思路:超級管理員在員工管理處上傳員工相對清晰的五官電子一寸照片。然后員工登錄自己的賬號,在考勤頁面點(diǎn)擊打卡,瀏覽器開啟電腦攝像頭,采集員工臉部信息照片,并且將這個照片與員工之前的電子照進(jìn)行比對比。
演示視頻:【學(xué)生考勤系統(tǒng)單人臉采集和多人臉識別和二維碼掃描識別身份簽到考勤系統(tǒng)展示-杰凡IT】 https://www.bilibili.com/video/BV1fq4y1L77p?p=2&share_source=copy_web&vd_source=ed0f04fbb713154db5cc611225d92156
先來看看實(shí)現(xiàn)的效果吧
首先需要百度申請接口,具體這里不在贅述,百度里申請個人開發(fā),人工智能,人臉識別里新建一個應(yīng)用,可以拿到三個參數(shù), 項(xiàng)目只用到了兩個 API Key 和clientSecret
在調(diào)用接口之前,需要獲取AccessToke,AccessToke有效期是一個月,然后根據(jù)AccessToke去調(diào)用人臉匹配接口。
第一步:獲取AccessToke,這個百度有api文檔,里面也寫得很輕清楚了,需要API Key 和clientSecret去獲取得到,代碼如下:
public class AuthService {public static String getAuth() {// 官網(wǎng)獲取的 API Key 更新為你注冊的String clientId = " ";// 官網(wǎng)獲取的 Secret Key 更新為你注冊的String clientSecret = " ";return getAuth(clientId, clientSecret);}public static String getAuth(String ak, String sk) {// 獲取token地址String authHost = "https://aip.baidubce.com/oauth/2.0/token?";String getAccessTokenUrl = authHost// 1. grant_type為固定參數(shù)+ "grant_type=client_credentials"// 2. 官網(wǎng)獲取的 API Key+ "&client_id=" + ak// 3. 官網(wǎng)獲取的 Secret Key+ "&client_secret=" + sk;try {URL realUrl = new URL(getAccessTokenUrl);// 打開和URL之間的連接HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();connection.setRequestMethod("GET");connection.connect();// 獲取所有響應(yīng)頭字段Map<String, List<String>> map = connection.getHeaderFields();// 遍歷所有的響應(yīng)頭字段for (String key : map.keySet()) {System.err.println(key + "--->" + map.get(key));}// 定義 BufferedReader輸入流來讀取URL的響應(yīng)BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String result = "";String line;while ((line = in.readLine()) != null) {result += line;}/*** 返回結(jié)果示例*/System.err.println("result:" + result);JSONObject jsonObject = new JSONObject(result);String access_token = jsonObject.getString("access_token");return access_token;} catch (Exception e) {System.err.printf("獲取token失敗!重新獲取");e.printStackTrace(System.err);}return null;}public static void main(String[] args) {System.out.println(getAuth());}第二部,調(diào)用照片匹配的接口并封裝,代碼如下:
參數(shù)說明img1和img2都是base64的格式,把兩張需要對比的照片穿進(jìn)去,返回值大于80說明比配成功,否則不是同一個人哦
第三部,寫前端頁面調(diào)用瀏覽器攝像頭,并把攝像頭采集到人臉照片以base64的方式傳給后臺,這個是我自己的jsp頁面代碼,直接復(fù)制應(yīng)該是不可以用的,但是里面html5調(diào)用攝像頭的可以參考使用哦。
注意:如果您的攝像頭打開很黑,有可能是您的電腦攝像頭壞掉了(臉都拍不清楚,肯定識別不了),這個不是代碼的問題哦,我用的360和谷歌瀏覽器測試均可打開攝像頭的。
代碼如下:
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <!DOCTYPE html> <html dir="ltr" lang="en"><head><%@ include file="common.jsp"%> </head><body><!-- ============================================================== --><!-- Preloader - style you can find in spinners.css --><!-- ============================================================== --><div class="preloader"><div class="lds-ripple"><div class="lds-pos"></div><div class="lds-pos"></div></div></div><!-- ============================================================== --><!-- Main wrapper - style you can find in pages.scss --><!-- ============================================================== --><div id="main-wrapper" data-navbarbg="skin6" data-theme="light" data-layout="vertical" data-sidebartype="full" data-boxed-layout="full"><!-- ============================================================== --><!-- Topbar header - style you can find in pages.scss --><!-- ============================================================== --><%@ include file="leftmenu.jsp"%><!-- ============================================================== --><!-- ============================================================== --><!-- Page wrapper --><!-- ============================================================== --><div class="page-wrapper"><!-- ============================================================== --><!-- Bread crumb and right sidebar toggle --><!-- ============================================================== --><!-- ============================================================== --><!-- End Bread crumb and right sidebar toggle --><!-- ============================================================== --><!-- ============================================================== --><!-- Container fluid --><!-- ============================================================== --><div class="container-fluid"><!-- ============================================================== --><!-- Start Page Content --><!-- ============================================================== --><!-- Row --><div class="row"><div class="col-12"><div class="card"><div class="card-body"><h4 class="card-title" style="text-align: center;">上下班請記得打卡哦</h4></div><div class="container" style="text-align: center;"><span id="clockin" class="mdi mdi-cloud-print" style="font-size: 10em"></span> <video id="video" width="480" height="320" style="display:none;"> </video><p id="video_tip" style="display:none;">臉部識別中,請正臉看向攝像頭,<span id="ts"></span></p> <canvas id="canvas" width="480" height="320" style="display:none;"></canvas><p id="result"></p></div></div></div> </div><!-- Row --><!-- ============================================================== --><!-- End PAge Content --><!-- ============================================================== --><!-- ============================================================== --><!-- Right sidebar --><!-- ============================================================== --><!-- .right-sidebar --><!-- ============================================================== --><!-- End Right sidebar --><!-- ============================================================== --></div><!-- ============================================================== --><!-- End Container fluid --><!-- ============================================================== --><!-- ============================================================== --></div><!-- ============================================================== --><!-- End Page wrapper --><!-- ============================================================== --></div></body><script type="text/javascript"> var t=5; $('#clockin').click(function(){$('#clockin').hide();$('#video,#video_tip').show();var inv=setInterval(function(){$('#ts').text(t+'s');if(t<0){t=5;context.drawImage(video, 0, 0, 480, 320);$('#canvas').show(); $('#clockin,#video,#video_tip').hide();clearInterval(inv);matchface();}t--;}, 1000); }) function matchface(){$.ajax({type:"post",url:"${ctx}/clockin/faceadd",dataType:"json",data: {faceimg:getBase64()} , success:function(data){if(data.status==1){$('#result').text(data.msg).css('color','green');} else{alert(data.msg);window.location.reload();}},fail:function(data){alert('請檢查網(wǎng)絡(luò)');window.location.reload();}}) } //訪問用戶媒體設(shè)備的兼容方法 function getUserMedi1;};</script> </html>第四部:調(diào)用后臺照片匹配接口,給前端返回結(jié)果,代碼如下:
@ResponseBody @RequestMapping("/faceadd") public Object faceadd(@RequestParam(value="pageNo",defaultValue="1")int pageNo,ScClockin o,Model model,HttpSession session,String faceimg,HttpServletRequest request) throws Exception {String isbenren=FaceMatch.faceMatch(faceimg(剛剛前端攝像頭拍攝的照片的buse64格式數(shù)據(jù)),“該員工之前的一寸電子照片的base64格式數(shù)據(jù)”);if(isbenren==null){m.put("status", "0");m.put("msg","臉部信息匹配失敗,重新簽到");return m;}double br=Double.parseDouble(isbenren);if(br<80){m.put("status", "0");m.put("msg","簽到失敗,不是本人");return m;}return m;}總結(jié)
以上是生活随笔為你收集整理的java基于springboot的人脸识别企业排班考勤系统之人脸识别模块的设计和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离线人脸识别SDK
- 下一篇: 在线相册 ,图片上传, 基于 Spri