zoukankan      html  css  js  c++  java
  • java实现人脸识别源码【含测试效果图】——Servlet层(FaceServlet)

    package org.web;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.util.Arrays;
    import java.util.HashMap;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.ServletActionContext;
    import org.entity.Users;
    import org.json.JSONObject;
    import org.service.IUserService;
    import org.service.impl.UserServiceImpl;
    
    import sun.misc.BASE64Decoder;
    
    import com.baidu.aip.face.AipFace;
    
    public class FaceServlet extends HttpServlet {
    
    	
    	/**
    	 * (非 Javadoc)
    	* <p>Description(描述):get方法,主要调用post </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)
    	 */
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    			doPost(request, response);
    	}
    
    	/**
    	 * (非 Javadoc)
    	* <p>Description(描述):post方法,主要进行业务操作 </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)
    	 */
    	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 		img			=	 	request.getParameter("img");			//图像数据
    		String 		username 	= 		request.getParameter("username");		//用户名
    		String 		tag			= 		request.getParameter("tag");
    		String APP_ID = "9802974";
    	    String API_KEY = "OVYw5Ok0y9U8n6CfVPYt0wfZ";
    	    String SECRET_KEY = "aCN3lupCarq3rC9G8Rylqz1d36Towp8G";
    	    AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    		if(tag.equals("reg")){
    			//注册
    			face(username, img, response,request,client);
    		}else if(tag.endsWith("login")){
    			//登陆
    			login(img, response, username,request,client);
    		}
    		
    	}
    	
    	/**
    	 * 
    	* @Title: face
    	* @Description: 该方法的主要作用:注册
    	* 1.将base64编码的图片保存
    	* 2.将图片路径保存在数据库里面
    	* 3.将人脸图片识别在人脸库中注册
    	* @param   设定文件  
    	* @return  返回类型:void   
    	* @throws
    	 */
    	public void face(String username,String img,HttpServletResponse response,HttpServletRequest request,AipFace client) {
    		Users user = new Users();
    		IUserService userService = new UserServiceImpl();
    		// 图片名称
    		String fileName = System.currentTimeMillis() + ".png";
    		String basePath = request.getSession().getServletContext()
    				.getRealPath("picture/");
    
    		// 往数据库里面插入注册信息
    		user.setId(((Long)System.currentTimeMillis()).intValue());
    		user.setUsername(username);
    		user.setHeadphoto("/picture/" + fileName);
    		userService.save(user);
    		// 往服务器里面上传图片
    		GenerateImage(img, basePath + "/" + fileName);
    		// 给人脸库中加入一个脸
    		boolean flag = facesetAddUser(client, basePath + "/" + fileName,
    				username);
    		try {
    			PrintWriter out = response.getWriter();
    			// 中文乱码,写个英文比较专业 哈哈
    
    			if (flag == false) {
    				out.print("请把脸放上!!");//请把两脸放上
    			} else {
    				out.print("注册成功!!");  //注册成功
    			}
    		} catch (IOException e) {
    			// TODO 异常执行块!
    			e.printStackTrace();
    		}
    	}
    
    
    	/**
    	 * 
    	* @Title: login
    	* @Description: 该方法的主要作用:登陆
    	* 实现原理:
    	* 1.从前台接收用户名
    	* 2.然后把从前台传过来的图片先上传到服务器
    	* 3.把上传的这张人脸与人脸库中的人脸对应
    	* @param  设定文件  
    	* @return  返回类型:String   
    	* @throws
    	 */
    	public void login(String img,HttpServletResponse response,String username,HttpServletRequest request,AipFace client) {
    		// 图片名称
    		String fileName = System.currentTimeMillis() + ".png";
    		String basePath = request.getSession().getServletContext()
    				.getRealPath("picture/");
    		// 往服务器里面上传图片
    		GenerateImage(img, basePath + "/" + fileName);
    		response.setContentType("text/html,charset=utf-8;");
    		try {
    			PrintWriter out = response.getWriter();
    			Double result = verifyUser(client, basePath + "/" + fileName,username);
    			if (result > 90) {
    				// 匹配成功
    				out.print("登陆成功");  
    			} else {
    				//匹配失败
    				out.print("登陆失败");
    
    			}
    		} catch (IOException e) {
    			// TODO 异常执行块!
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 
    		* @Title: GenerateImage
    		* @Description: 该方法的主要作用:// 对字节数组字符串进行Base64解码并生成图片
    		* @param  @param imgStr
    		* @param  @param imgFilePath
    		* @param  @return 设定文件  
    		* @return  返回类型:boolean   
    		* @throws
    		 */
    	public boolean GenerateImage(String imgStr, String imgFilePath) {
    		if (imgStr == null) // 图像数据为空
    			return false;
    		BASE64Decoder decoder = new BASE64Decoder();
    		try {
    			// Base64解码
    			byte[] bytes = decoder.decodeBuffer(imgStr);
    			for (int i = 0; i < bytes.length; ++i) {
    				if (bytes[i] < 0) {// 调整异常数据
    					bytes[i] += 256;
    				}
    			}
    			// 生成jpeg图片
    			OutputStream out = new FileOutputStream(imgFilePath);
    			out.write(bytes);
    			out.flush();
    			out.close();
    			return true;
    		} catch (Exception e) {
    			e.printStackTrace();
    			return false;
    		}
    	}
    	
    		/** 
    		 * @Title: facesetAddUser
    	    * @Description: 该方法的主要作用:人脸注册,给人脸库中注册一个人脸
    	    * @param  @param client 设定文件  
    	    * @return  返回类型:void   
    	    * @throws
    	     */
    	public boolean facesetAddUser(AipFace client, String path, String username) {
    		// 参数为数据库中注册的人脸
    		HashMap<String, String> options = new HashMap<String, String>();
    		JSONObject res = client.addUser(username, "test_users_info",
    				Arrays.asList("group1", "group2"), path, options);
    		 System.out.println(res.toString(2));
    		// {"log_id": 3621903690062422}
    		if (res.keySet().contains("error_code")) {
    			return false;
    		}
    		return true;
    
    	}
    	/**
    	 * 
    	* @Title: verifyUser
    	* @Description: 该方法的主要作用:人脸认证
    	* @param  @param client
    	* @param  @param path
    	* @param  @param username
    	* @param  @return 设定文件  
    	* @return  返回类型:Double   
    	* @throws
    	 */
    	    
    	public Double verifyUser(AipFace client, String path, String username) {
    		HashMap<String, Object> options = new HashMap<String, Object>(1);
    		options.put("top_num", 5);
    		/*try {
    			Thread.sleep(2000);
    		} catch (InterruptedException e) {
    			// TODO 异常执行块!
    			e.printStackTrace();
    		}*/
    		JSONObject res = client.verifyUser(username,
    				Arrays.asList("group1", "group2"), path, options);
    		Double result = Double.parseDouble(res.getJSONArray("result").get(0)
    				.toString());
    		return result;
    	}
    
    
    }
    
  • 相关阅读:
    [原创]什么是兼容性测试?
    [原创]Web开发测试辅助工具介绍
    [原创]如何顺利通过中国电信Brew平台软件测试?
    [原创]网站性能优化利器之二"Yahoo Yslow"
    [原创]HP SiteScope工具介绍及下载地址
    [原创]网站前端页面级性能测试方法
    [原创]网银在线chinabank安全漏洞之“不完善的开发软件包”
    [原创] linux必学的常用命令
    [原创]如何做好目标管理?
    Visual Studio 小技巧:自定义代码片断
  • 原文地址:https://www.cnblogs.com/a1111/p/12816163.html
Copyright © 2011-2022 走看看