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 dataMap = new ConcurrentHashMap();
/**
* (非 Javadoc)
* Description(描述):调用dopost的方法
* Title: doGet
* @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)
* Description(描述):dopost方法
* Title: doPost
* @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 options = new HashMap();
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);
}
}