zoukankan      html  css  js  c++  java
  • 人脸识别活体检测之张张嘴和眨眨眼——FaceServlet

    package org.web;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.entity.Landmark;
    import org.json.JSONObject;
    import org.util.Json_Parsing;
    
    import com.baidu.aip.face.AipFace;
    
    public class FaceServlet extends HttpServlet {
    
    
    
        /**
        * @Fields serialVersionUID :该字段的意思:
        * 个人博客:https://blog.csdn.net/qq_34137397
        */
    
        private static final long serialVersionUID = 7753313994078255746L;
        //百度云信息
        private String APP_ID = "你的APP_ID ";
        private String API_KEY = "你的API_KEY ";
        private String SECRET_KEY = "你的SECRET_KEY ";
        private AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);  
        private Map<Integer, Object> dataMap = new ConcurrentHashMap<Integer,Object>();
        /**
         * (非 Javadoc)
        * <p>Description(描述):调用dopost的方法 </p>
        * <p>Title: doGet</p>
        * @param request
        * @param response
        * @throws ServletException
        * @throws IOException
        * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
        * 个人博客:https://blog.csdn.net/qq_34137397
         */
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);
        }
    
    
        /**
         * (非 Javadoc)
        * <p>Description(描述):dopost方法 </p>
        * <p>Title: doPost</p>
        * @param request
        * @param response
        * @throws ServletException
        * @throws IOException
        * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
        * 个人博客:https://blog.csdn.net/qq_34137397
         */
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 防止乱码
            response.setContentType("text/html;charset=utf-8");
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            String tag = request.getParameter("tag");           //区分操作类型的值
            String img = request.getParameter("img");           // 图像数据
    
            if(tag.equals("mouse")){
                //张嘴
                face_mouse(img,response,request);
            }else if(tag.equals("eye")){
                //眨眼比较
                face_eye(img,response,request);
            }
    
        }
        //C#winforms实现windows窗体人脸识别
    
    
    
        /**
         * 
        * @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();
                    }
                }
            }
        }
    
    
        /**
         * 
        * @Description: 该方法的主要作用:活体检测
        * @Title: face_jiance
        * @param  @param img
        * @param  @return 设定文件  
        * @return  返回类型:Landmark   
        * @throws
        * 个人博客:https://blog.csdn.net/qq_34137397
         */
        private Landmark face_jiance(String img){
             HashMap<String, String> options = new HashMap<String, String>();
                options.put("face_field", "landmark");
                options.put("face_type", "LIVE");
                String image = img;
                String imageType = "BASE64";
                // 人脸检测
                JSONObject res = null;
                try {
                    res = client.detect(image, imageType, options);
                } catch (Exception e) {
                    // TODO 异常执行块!
                    e.printStackTrace();
    
                }
               return Json_Parsing.parsingFaceJson(res);
        }
    
    
    }
    
  • 相关阅读:
    个人阅读笔记05—数据流图
    JVM(三)程序计数器【PC寄存器】
    JVM(三)运行时数据区的概述,线程概述
    JVM(二)表示两个Class对象是否为同一个类;Java程序对类的使用
    我的面试经之JVM(二)双亲委派机制
    我的面试经之JVM(二) ClassLoader补充【获取类的加载器的方式】
    我的面试经之JVM(二)类加载器的分类
    我的面试经之JVM(二)类加载器子系统ClassLoader类的加载过程
    Python小白要了解的模块大概用途(随学习进度更新),import xxxx
    Python常见的模块(知乎转载)
  • 原文地址:https://www.cnblogs.com/a1111/p/12816020.html
Copyright © 2011-2022 走看看