人脸识别活体检测之眨眨眼和张张嘴

【这段时间有点忙,终于截止今天2018.06.22完成了人脸识别的最后一道程序——活体检测之眨眨眼和张张嘴】
关于人脸识别的内容我之前也写过好几篇博文,其中有:
{java实现人脸识别源码}
{C#winforms实现windows窗体人脸识别}
{人脸识别活体检测测试案例}
大家可以去看看,其中兼容性也比较良好,支持常用浏览器,火狐、谷歌、360、UC浏览器以及opera浏览器,源码也已经上传成功,所需要的JS文件和jar也都上传到资源页。


好了,我们废话不多说,先来说说今天的内容。
眨眨眼和张张嘴在哪里用的到呢?如果大家不知道其他的软件,大家肯定知道支付宝软件吧,其中支付宝软件登陆的时候就会语音提示眨眨眼和张张嘴来验证是不是本人登陆(限制照片登陆)
这里写图片描述

以前刚开始写的时候我写的人脸识别用照片也可以识别,然后好多粉丝留言说这太不安全了,还有几个用嫌弃的眼神对我说:你这做的还有啥用,我拿着你的照片来登陆,居然能登陆成功,还不如以前的密码登陆安全呢。(其实他没做出来~),我也没说啥,毕竟是自己做的不完善呢,忍气吞声继续深入研究。终于做出来了后来的活体检测,也就是上面的第二个链接!
但是……
这个活体检测有时候会失误!会失误!会失误!!!
这是个很大的bug,于是我就开始开发现在的眨眨眼和张张嘴~


一、首先我来说一下运行过程:
首先进入页面,login.jsp中,点击检测按钮
这里写图片描述
接着你会听到语音提示:现在请张张嘴(这个语音提示可是专门找美女录得音呢~)
你就按照语音提示张张嘴就可以了,张合张合重复一遍就大概可以验证成功了,接着你就会听见语音提示:现在请眨眨眼,这时候你眨眨眼就行了,验证通过会进入我的网站,期间如果你的脸没有放置好的话就会提示:
这里写图片描述
当你看到提示这个的时候你把脸调整的放到框内就可以了。实在不行你就刷新一下网页重新来一遍吧。


二、技术分析
技术方面有以下几个步骤:
第一,js调用前台摄像头读取人脸信息,提交到后台的FaceServlet中,通过ajax进行交互,参数分别是:

  1. type : “post”,//提交方式
  2. url : “faceServlet”,//请求地址
  3. data : {
    “img” : imgData1,
    “tag” : “eye”//区分是眨眼还是张嘴
    }//数据

4.dataType : “json”
上面就是ajax请求的参数,然后写个回调函数就可以了。
第二、拿着Base64图像数据之后去检测去,检测回来的数据如下所示:

{
“timestamp”: 1528371144,
“result”: {
“face_list”: [{
“expression”: {
“probability”: 0.9999684095,
“type”: “none”
},
“face_probability”: 0.9626089931,
“glasses”: {
“probability”: 0.9998494387,
“type”: “common”
},
“location”: {
“height”: 307,
“rotation”: 2,
“width”: 273,
“left”: 296.1046143,
“top”: 163.5777588
},
“landmark72”: [
{
“y”: 241.360199,
“x”: 292.4519043
},
{
“y”: 284.3699341,
“x”: 295.9116211
},
{
“y”: 328.4156189,
“x”: 304.021759
},
{
“y”: 371.3819275,
“x”: 314.0935364
},
{
“y”: 416.5806274,
“x”: 333.3151245
},
{
“y”: 459.6279297,
“x”: 370.47229
},
{
“y”: 476.2438354,
“x”: 412.0462036
},
{
“y”: 469.1072998,
“x”: 457.7119141
},
{
“y”: 435.0166626,
“x”: 501.7189941
},
{
“y”: 390.2756348,
“x”: 532.2461548
},
{
“y”: 345.0927124,
“x”: 548.138916
},
{
“y”: 299.1921692,
“x”: 559.2930298
},
{
“y”: 254.285141,
“x”: 565.3004761
},
{
“y”: 230.1785583,
“x”: 329.6694946
},
{
“y”: 222.2650757,
“x”: 343.285614
},
{
“y”: 220.7796631,
“x”: 356.7460938
},
{
“y”: 223.9135742,
“x”: 371.3406677
},
{
“y”: 233.6182861,
“x”: 385.2095947
},
{
“y”: 235.2540588,
“x”: 370.6172485
},
{
“y”: 236.2314148,
“x”: 356.4389343
},
{
“y”: 234.2461243,
“x”: 341.9369507
},
{
“y”: 227.4796143,
“x”: 355.9927368
},
{
“y”: 193.4365387,
“x”: 313.8055115
},
{
“y”: 170.465332,
“x”: 331.9764404
},
{
“y”: 166.3371429,
“x”: 356.399353
},
{
“y”: 170.4036255,
“x”: 380.4868774
},
{
“y”: 188.2350311,
“x”: 401.4260559
},
{
“y”: 188.1490021,
“x”: 379.4369202
},
{
“y”: 186.7609863,
“x”: 356.0379028
},
{
“y”: 188.6333923,
“x”: 333.6030884
},
{
“y”: 237.4863892,
“x”: 465.0245972
},
{
“y”: 228.826889,
“x”: 479.3971558
},
{
“y”: 228.0735474,
“x”: 494.7539673
},
{
“y”: 231.1828613,
“x”: 509.2977905
},
{
“y”: 239.077301,
“x”: 523.2540283
},
{
“y”: 242.3865967,
“x”: 508.8378296
},
{
“y”: 242.7297668,
“x”: 493.300415
},
{
“y”: 240.5341339,
“x”: 478.2283325
},
{
“y”: 233.886261,
“x”: 491.254364
},
{
“y”: 192.1312256,
“x”: 450.9655762
},
{
“y”: 176.1939087,
“x”: 474.1013794
},
{
“y”: 174.3426819,
“x”: 500.0958252
},
{
“y”: 180.6152649,
“x”: 525.2724609
},
{
“y”: 205.0406799,
“x”: 544.15802
},
{
“y”: 198.3281097,
“x”: 522.0322266
},
{
“y”: 193.9849396,
“x”: 498.171875
},
{
“y”: 193.6101837,
“x”: 474.463501
},
{
“y”: 235.1314545,
“x”: 405.7365417
},
{
“y”: 263.1231384,
“x”: 398.9992065
},
{
“y”: 291.5641174,
“x”: 392.697998
},
{
“y”: 321.401062,
“x”: 382.6131592
},
{
“y”: 322.6088257,
“x”: 400.7704468
},
{
“y”: 323.8301086,
“x”: 443.7107544
},
{
“y”: 324.1907959,
“x”: 464.1107788
},
{
“y”: 293.3712769,
“x”: 453.4411926
},
{
“y”: 264.8468323,
“x”: 448.3047485
},
{
“y”: 236.6197968,
“x”: 443.6154175
},
{
“y”: 305.3646545,
“x”: 421.223877
},
{
“y”: 383.9639282,
“x”: 375.137085
},
{
“y”: 363.3876343,
“x”: 393.6142578
},
{
“y”: 360.5367126,
“x”: 422.6240845
},
{
“y”: 366.1363525,
“x”: 451.1436768
},
{
“y”: 389.2103271,
“x”: 469.8604736
},
{
“y”: 407.2568359,
“x”: 450.6833191
},
{
“y”: 413.2620239,
“x”: 420.4364014
},
{
“y”: 403.9484863,
“x”: 390.8678589
},
{
“y”: 377.3647461,
“x”: 396.2229004
},
{
“y”: 376.8469238,
“x”: 421.9415588
},
{
“y”: 379.1690674,
“x”: 447.9805908
},
{
“y”: 390.7108154,
“x”: 446.4016724
},
{
“y”: 391.1112061,
“x”: 421.5936279
},
{
“y”: 388.0070801,
“x”: 396.4388733
}
],
“face_token”: “05f2d8abe9fb3ff0a7b2e590c3af1b94”,
“face_shape”: {
“probability”: 0.5348426104,
“type”: “oval”
},
“race”: {
“probability”: 0.9990831614,
“type”: “yellow”
},
“angle”: {
“yaw”: 0.9113687873,
“roll”: 2.805583239,
“pitch”: -3.07931757
},
“landmark”: [
{
“y”: 227.4796143,
“x”: 355.9927368
},
{
“y”: 233.886261,
“x”: 491.254364
},
{
“y”: 305.3646545,
“x”: 421.223877
},
{
“y”: 385.065155,
“x”: 421.7819214
}
],
",
“quality”: {
“completeness”: 1,
“occlusion”: {
“left_eye”: 0,
“chin_contour”: 0.2168905884,
“mouth”: 0,
“right_cheek”: 0.02743142098,
“left_cheek”: 0.01728247851,
“nose”: 0.08578856289,
“right_eye”: 0
},
“blur”: 8.371096101E-7,
“illumination”: 54
},
“face_type”: {
“probability”: 0.9988574386,
“type”: “human”
}
}],
“face_num”: 1
},
“cached”: 0,
“error_code”: 0,
“log_id”: 2850674365,
“error_msg”: “SUCCESS”
}

看到上面的json数据,我当时一看是懵逼的状态,这json解析起来有点费力,经过一番折腾,终于可以解析出来了,其中解析方法如下:public static Landmark  parsingFaceJson(JSONObject json_str){Landmark landmark = new Landmark();//开始解析json//JSONObject  dataJson=new JSONObject(json_str);//找到result节点JSONObject  response_result=json_str.getJSONObject("result");//继续找face_list节点JSONArray face_list_jsonArray=response_result.getJSONArray("face_list");JSONObject face_list_jsonObject=face_list_jsonArray.getJSONObject(0);//找到landmark(关键点)节点,4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心final JSONArray landmark_jsonArray=face_list_jsonObject.getJSONArray("landmark");//左眼中心landmark.setLeft_eye_zhongxin(new ArrayList<Double>(){{add((Double) landmark_jsonArray.getJSONObject(0).get("y")); add((Double) landmark_jsonArray.getJSONObject(0).get("x"));}});//右眼中心landmark.setRight_eye_zhongxin(new ArrayList<Double>(){{add((Double) landmark_jsonArray.getJSONObject(1).get("y")); add((Double) landmark_jsonArray.getJSONObject(1).get("x"));}});//鼻尖landmark.setNose_zhongxin(new ArrayList<Double>(){{add((Double) landmark_jsonArray.getJSONObject(2).get("y")); add((Double) landmark_jsonArray.getJSONObject(2).get("x"));}});//嘴中心landmark.setMouse_zhongxin(new ArrayList<Double>(){{add((Double) landmark_jsonArray.getJSONObject(3).get("y")); add((Double) landmark_jsonArray.getJSONObject(3).get("x"));}});//继续找landmark72节点final JSONArray landmark72_jsonArray=face_list_jsonObject.getJSONArray("landmark72");//左眼上边landmark.setLeft_eye_top(new ArrayList<Double>(){{add((Double) landmark72_jsonArray.getJSONObject(14).get("y")); add((Double) landmark72_jsonArray.getJSONObject(14).get("x"));}});//左眼下边landmark.setLeft_eye_bottom(new ArrayList<Double>(){{add((Double) landmark72_jsonArray.getJSONObject(19).get("y")); add((Double) landmark72_jsonArray.getJSONObject(19).get("x"));}});//右眼上边landmark.setRight_eye_top(new ArrayList<Double>(){{add((Double) landmark72_jsonArray.getJSONObject(32).get("y")); add((Double) landmark72_jsonArray.getJSONObject(32).get("x"));}});//右眼下边landmark.setRight_eye_bottom(new ArrayList<Double>(){{add((Double) landmark72_jsonArray.getJSONObject(36).get("y")); add((Double) landmark72_jsonArray.getJSONObject(36).get("x"));}});//嘴巴上边landmark.setMouse__top(new ArrayList<Double>(){{add((Double) landmark72_jsonArray.getJSONObject(60).get("y")); add((Double) landmark72_jsonArray.getJSONObject(60).get("x"));}});//嘴巴下边landmark.setMouse__bottom(new ArrayList<Double>(){{add((Double) landmark72_jsonArray.getJSONObject(70).get("y")); add((Double) landmark72_jsonArray.getJSONObject(70).get("x"));}});return landmark;}

其中的Landmark 类型 是个实体类,实体类的源码请参考本文末~
解析完json就可以分析数据了,当时在此处遇到了个难点,很是想不通的一个逻辑,于是就去各大java群里面进行提问,功夫不负有心人,遇到一大佬给我话了个图解决了我当时的难点,(这边要特别鸣谢一下大佬!!)图:
这里写图片描述
光看图大家肯定看不明白,我在这里先解释一下吧,我当时的思路是:前台通过定时器,每1s进行提交一次图像数据,然后在后台进行比较上一次执行结果和下一次执行结果的值,然后想不通这里面的业务是什么样子的,于是就有了上面的这张图。
第三、分析数据:
张嘴:通过json获取嘴中心的点和上边、下边的位置,张嘴和闭嘴是有差别的,差别如下(解析的json数据):

嘴巴分析:----闭着嘴巴:
第一次的上嘴唇:361.1332397
第一次的嘴唇中心:378.8190308
第一次的下嘴唇:382.1697388上中:17
下中:4第一次的上嘴唇:390.951355
第一次的嘴唇中心:409.0862122
第一次的下嘴唇:414.6711731上中:19
下中:5第一次的上嘴唇:402.4402466
第一次的嘴唇中心:417.4428406
第一次的下嘴唇:419.6887207上中:15
下中:2第一次的上嘴唇:403.1029358
第一次的嘴唇中心:419.4420166
第一次的下嘴唇:424.0343018上中:16
下中:5第一次的上嘴唇:445.7279663
第一次的嘴唇中心:455.8665161
第一次的下嘴唇:457.3482971上中:10
下中:2第二次的上嘴唇:454.5872192
第二次的嘴唇中心:462.1132812
第二次的下嘴唇:463.1278381上中:8
下中:1

上中:嘴唇上边与嘴唇中心的距离
下中:嘴唇下边与嘴唇中心的距离

眨眼:正常人的眼镜都是有两只(左眼和右眼),所以这边我们比较的时候就比张嘴验证麻烦了,思路还是和张嘴的思路是一样的,下面的返回解析的分析数据:

***********************************************************************************
闭着眼的左眼上边:250.549469
闭着眼的左眼中间:252.7034607
闭着眼的左眼下边:258.3751831
闭着眼的左眼上边与中间的值:2.153991700000006
闭着眼的左眼下边与中间的值:5.6717224000000215
闭着眼的右眼上边:248.886261
闭着眼的右眼中间:251.9490204
闭着眼的右眼下边:257.2275391
闭着眼的右眼上边与中间的值:3.0627594000000045
闭着眼的右眼下边与中间的值:5.2785187000000064闭着眼的左眼上边:236.7052612
闭着眼的左眼中间:239.7859192
闭着眼的左眼下边:245.471283
闭着眼的左眼上边与中间的值:3.0806579999999997
闭着眼的左眼下边与中间的值:5.685363800000005
闭着眼的右眼上边:234.837738
闭着眼的右眼中间:238.6846619
闭着眼的右眼下边:244.2976685
闭着眼的右眼上边与中间的值:3.8469239000000073
闭着眼的右眼下边与中间的值:5.613006599999977闭着眼的左眼上边:245.0596619
闭着眼的左眼中间:246.9369202
闭着眼的左眼下边:252.2763367
闭着眼的左眼上边与中间的值:1.877258299999994
闭着眼的左眼下边与中间的值:5.339416499999999
闭着眼的右眼上边:241.4249573
闭着眼的右眼中间:244.3227234
闭着眼的右眼下边:249.2035217
闭着眼的右眼上边与中间的值:2.8977661000000126
闭着眼的右眼下边与中间的值:4.880798300000009
*********************************************************************************
闭着眼的左眼上边与中间的值:2.843383799999998
闭着眼的左眼下边与中间的值:6.379211400000003
闭着眼的右眼上边与中间的值:3.6415863
闭着眼的右眼下边与中间的值:5.569457999999997
闭着眼的左眼上边与中间的值:7.1395263
闭着眼的左眼下边与中间的值:8.606811599999986
闭着眼的右眼上边与中间的值:7.101028499999984
闭着眼的右眼下边与中间的值:7.526168800000022
闭着眼的左眼上边与中间的值:4.141037000000011
闭着眼的左眼下边与中间的值:7.363510200000007
闭着眼的右眼上边与中间的值:4.587234499999994
闭着眼的右眼下边与中间的值:6.540771500000034
闭着眼的左眼上边与中间的值:2.4197997999999643
闭着眼的左眼下边与中间的值:5.460693300000003
闭着眼的右眼上边与中间的值:2.9811705999999845
闭着眼的右眼下边与中间的值:4.65585329999999

上面数据一大推,大家看出来个123就行了。
验证成功返回前台就行了。


关键代码贴上来:
张张嘴的验证:

/*** * @Description: 该方法的主要作用:张张嘴验证* @Title: face_jiance* @param  @param img* @param  @param response* @param  @param request 设定文件  * @return  返回类型:void   * @throws* 个人博客:https://blog.csdn.net/qq_34137397*/private void face_mouse(String img, HttpServletResponse response,HttpServletRequest request) {/*if (dataMap.get(1) == null) {// 第一次请求landmark = face_jiance(img);System.out.println("第一次的上嘴唇:"+landmark.getMouse__top().get(0));System.out.println("第一次的嘴唇中心:"+landmark.getMouse_zhongxin().get(0));System.out.println("第一次的下嘴唇:"+landmark.getMouse__bottom().get(0));dataMap.put(1, landmark);} else {*/// 不是第一次请求Landmark landmark_next = face_jiance(img);// 和前一次的数据进行比较//Landmark landmark_pre = (Landmark) dataMap.get(1);// 嘴唇上面的位置相对于中心点对比PrintWriter writer;if ((landmark_next.getMouse_zhongxin().get(0) - landmark_next.getMouse__top().get(0)) > 40&&(landmark_next.getMouse__bottom().get(0) - landmark_next.getMouse_zhongxin().get(0)) > 30) {try {writer = response.getWriter();writer.print("1");} catch (IOException e) {// TODO 异常执行块!e.printStackTrace();}}else{try {writer = response.getWriter();writer.print("0");} catch (IOException e) {// TODO 异常执行块!e.printStackTrace();}}//dataMap.put(1,landmark_next);			//放进去  方便下次进行比较}/*}*/

眨眨眼的验证代码:

	/*** * @Description: 该方法的主要作用:眨眼对比* @Title: face_eye* @param  @param img* @param  @param response* @param  @param request 设定文件  * @return  返回类型:void   * @throws* 个人博客:https://blog.csdn.net/qq_34137397*/private void face_eye(String img, HttpServletResponse response,HttpServletRequest request) {Landmark landmark_next = face_jiance(img);System.out.println("闭着眼的左眼上边与中间的值:"+((landmark_next.getLeft_eye_zhongxin().get(0))-(landmark_next.getLeft_eye_top().get(0))));System.out.println("闭着眼的左眼下边与中间的值:"+((landmark_next.getLeft_eye_bottom().get(0))-(landmark_next.getLeft_eye_zhongxin().get(0))));System.out.println("闭着眼的右眼上边与中间的值:"+((landmark_next.getRight_eye_zhongxin().get(0))-(landmark_next.getRight_eye_top().get(0))));System.out.println("闭着眼的右眼下边与中间的值:"+((landmark_next.getRight_eye_bottom().get(0))-(landmark_next.getRight_eye_zhongxin().get(0))));System.out.println("__________________________________________________");PrintWriter writer;if ((landmark_next.getLeft_eye_zhongxin().get(0))- (landmark_next.getLeft_eye_top().get(0)) < 6&& (landmark_next.getRight_eye_zhongxin().get(0))- (landmark_next.getRight_eye_top().get(0)) < 6) {System.out.println("进来了上边验证成功");// 继续判断下边的if ((landmark_next.getLeft_eye_bottom().get(0))- (landmark_next.getLeft_eye_zhongxin().get(0)) < 6.6&& (landmark_next.getRight_eye_bottom().get(0))- (landmark_next.getRight_eye_zhongxin().get(0)) < 6.6) {System.out.println("进来了下边验证成功");try {writer = response.getWriter();writer.print("1");} catch (IOException e) {// TODO 异常执行块!e.printStackTrace();}} else {try {writer = response.getWriter();writer.print("0");} catch (IOException e) {// TODO 异常执行块!e.printStackTrace();}}}}

最后上传源码:

1.jar包、js和css下载地址:我的资源页
2.Landmark实体类
3.解析json类Json_Parsing
4.Servlet:FaceServlet
5.readme日志分析
6.web.xml
7.login.jsp
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作效益问题

图解 代码实现 package com.kuang.study.lanqiao;public class Main {public static void main(String[] args) {int n8;//机器人个数int[] pre{0,0,0,0,1,0,2,3,5};//选择这个工作后的其那句最近工作下标int[] profit {5,1,8,4,6,3,2,4}; //工作收益int opt[]new int[n1];op…

amazon php 空间,(四)Amazon Lightsail 部署LAMP应用程序之扩展PHP前端

扩展PHP前端既然PHP前端和数据库是分开的&#xff0c;您将为Web层添加可伸缩性和容错性: 在以下步骤&#xff0c;您将获取Web前端实例的快照&#xff0c;并从该快照部署另外2个Web层实例。最终&#xff0c;您将在三个Web实例前面添加一个负载均衡器。至此&#xff0c;您将拥有一…

人脸识别活体检测之张张嘴和眨眨眼——Landmark

/** * Title: Landmark.java * Package org.entity * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2018-6-8 上午10:39:01 * blog https://blog.csdn.net/qq_34137397 * version V1.0 */ package org.entity;import java.…

相邻数字+(正月点灯笼的动态规划2)(递归+DP)---JAVA

思路分析 代码实现 递归实现 package com.kuang.study.lanqiao;public class Main {public static void main(String[] args) {int arr[]{1,2,4,1,7,8,3};int max d(arr,arr.length-1);System.out.println(max);}public static int d(int[] arr,int n){if(n0){return arr[0]…

.NET Core Tools 1.0 版本

与上周发布的Visual Studio 2017一起&#xff0c;微软还发布了.NET Core Tools 1.0。这些工具对所有.NET核心开发人员都非常有用&#xff0c;无论他们使用VS2017、Visual Studio for Mac、Visual Studio Code&#xff0c;还是基于他们自己选择的非微软IDE。 对于想要使用.NET C…

MySQL day()函数

转载自 MySQL day()函数 MySQL DAY函数简介 DAY函数返回给定日期的月份的日期部分。下面显示DAY函数的语法&#xff1a; DAY(date);DAY函数接受一个参数&#xff0c;它是您要获取月份日期的日期值。如果date参数为零&#xff0c;例如0000-00-00&#xff0c;则DAY函数返回0&…

matlab 的excel 对象,MATLAB 中的 COM 对象

COM concepts and an overview of COM support in MATLAB.Examples that show how to use COM interface with MATLAB.Before using COM objects, you must register their servers.如何创建 Microsoft 控件和 COM 服务器对象Pass data to and handle data from a COM object.L…

人脸识别活体检测之张张嘴和眨眨眼——Json_Parsing

/** * Title: Json_Parsing.java * Package org.util * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2018-6-9 上午10:33:48 * blog https://blog.csdn.net/qq_34137397 * version V1.0 */ package org.util;import java.…

MySQL date_add()函数​​​​​​​

转载自 MySQL date_add()函数 MySQL DATE_ADD函数简介 DATE_ADD函数将间隔时间添加到DATE或DATETIME值。 下面说明了DATE_ADD函数的语法&#xff1a; DATE_ADD(start_date, INTERVAL expr unit);DATE_ADD函数有两个参数&#xff1a; start_date是DATE或DATETIME的起始值。…

交换数组中的两个元素

方法一 public static void swap(int[] arr,int i,int j){arr[i]arr[i]^arr[j];arr[j]arr[i]^arr[j];arr[i]arr[i]^arr[j];}方法二 public static void swap(int[] arr,int i,int j){int temparr[i];arr[i]arr[j];arr[j]temp;}

塑造Visual Studio的未来

类似于Windows Insider计划&#xff0c;Microsoft为Visual Studio也启动了一项提前体验计划。该计划被命名为Visual Studio预览&#xff0c;它允许任何对Visual Studio未来感兴趣的用户都能参与其中。Microsoft已经为Visual Studio的三个主要版本&#xff08;社区版、专业版、企…

php划分年龄段,儿童时期是怎样划分年龄阶段的

儿童时期是人生开始的一个重要年龄阶段&#xff0c;一般是指从出生到15周岁。儿童时期生理、心理发育很快&#xff0c;不同的月龄和不同的年龄具有不同的生理与心理特征。因此&#xff0c;根据儿童各年龄时期的胜利与心理特征和不同的发展规律&#xff0c;进一步将儿童时期划分…

MySQL date_sub()函数

转载自 MySQL date_sub()函数 MySQL DATE_SUB函数简介 DATE_SUB()函数从DATE或DATETIME值中减去时间值(或间隔)。 下面说明了DATE_SUB()函数的语法&#xff1a; DATE_SUB(start_date,INTERVAL expr unit);DATE_SUB()函数接受两个参数&#xff1a; start_date是DATE或DATET…

php无限极菜单,无限极菜单的实现

摘要&#xff1a;<?php /** * Created by PhpStorm. * User: 12757 * Date: 2019/4/16 * Time: 18:32 */namespace app\admins\controller;use think\Controller;use Util\SysDb;class Menu extends Base{ public func/*** Created by PhpStorm.* User: 12757* Date: 20…

2016蓝桥杯省赛---java---C---8(冰雹数)

题目描述 任意给定一个正整数N&#xff0c; 如果是偶数&#xff0c;执行&#xff1a; N / 2 如果是奇数&#xff0c;执行&#xff1a; N * 3 1生成的新的数字再执行同样的动作&#xff0c;循环往复。通过观察发现&#xff0c;这个数字会一会儿上升到很高&#xff0c; 一会儿又…

临时表的软更新

当今绝大多数开发者都使用经典关系数据库来存储数据。尽管取而代之的无架构数据存储&#xff08;统称为“NoSQL 存储”&#xff09;在各种业务方案中都证明相当有效&#xff0c;但经典关系数据库是沿用了几十年且目前仍适用的方法。每次更新现有表记录时&#xff0c;都不会自动…

人脸识别活体检测之张张嘴和眨眨眼——readme

人脸检测返回参数详情 ———————————————————————————————————————————————————————————————————————————————————————————————— 字段 必选 类型 说明 face_num 是 int 检测…

MySQL date_format()函数

转载自 MySQL date_format()函数 MySQL DATE_FORMAT函数简介 要将日期值格式化为特定格式&#xff0c;请使用DATE_FORMAT函数。 DATE_FORMAT函数的语法如下&#xff1a; DATE_FORMAT(date,format);DATE_FORMAT()函数接受两个参数&#xff1a; date&#xff1a;是要格式化…

人脸识别活体检测之张张嘴和眨眨眼——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.co…

股骨截骨php钢板,股骨远端截骨(DFO)术前设计及手术步骤【附视频】

各种原因引起的膝关节畸形,常伴不同程度的疼痛和功能障碍。截骨矫形术就是通过改善膝关节的负重轴线以达到矫正畸形确保膝关节稳定和解除疼痛三个目的。因此截骨术是骨性关节炎(OA)阶梯治疗中重要手术方法之一&#xff0c;对改善骨性关节炎(OA)关节功能和症状同时又能保留关节具…