SSM+ajax使用百度AI人脸识别(人脸对比)功能心得

最近做毕业设计,算是自己第一次独立完成一个系统,使用了百度ai的接口,查询了大部分网络上的博客,也来分享一下自己的经验。

1.首先,使用之前先注册一个百度AI开放平台的账号
在这里插入图片描述
2.登录之后,创建属于自己的项目

3.找到自己应用的AppID,API Key(AK),Secret Key(SK).
在这里插入图片描述
好了,到这里就算完成了准备工作。
接下来要开始编写代码了。

因为我使用的是人脸识别来完成登录工作,所以我需要调用电脑的摄像头,完成摄像,图片上传的工作。

这部分可以借鉴这个网址

> https://www.cnblogs.com/imwtr/p/6413595.html

注:使用画布的toDataURL方法获取到的就是base64编码格式,是一个String类型的,所以后台需要用string类型获取。

注:base64编码是有编码头部的,所以base64前面一部分是可以去掉的,可以在网上找一下相关的方法。

前台完成之后,开始后台的相关编码。

我使用了SSM框架进行开发,所以在Controller使用string来获取的。不过在传数据之前,还需要做一个事,就是将需要识别的人脸上传到百度ai的人脸库中。

在这里插入图片描述
在这里,一般都是调用它的接口,将照片上传。前台可以像上面的前台一样,也可以使用的file属性,来上传图片。具体选择看自己。

然后正式开始百度ai的调用。

1.在pom.xml中加入依赖
在这里插入图片描述
或者直接下载jar包,导入。

2.下载百度ai提供的四个工具类

/**
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
*/

3.新建一个工具类FaceSpot,获取token和实现其他接口

//在这里填写自己的AK,SK
public static String getAuth() {
        // 官网获取的 API Key 更新为你注册的
        String clientId = "你的AK";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "你的SK";
        return getAuth(clientId, clientSecret);
    }
    
    //获取自己的token_access
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为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            /**
             * 返回结果示例
             */
            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;
 }

4.调用人脸库接口

//人脸库注册
    public static String add(String img, String u_id, String user_info) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add";
        try {
            String imgParam = URLEncoder.encode(img, "UTF-8");
            Map<String, Object> map = new HashMap<>();
            map.put("image", img);
            //活体检测
            map.put("liveness_control", "NORMAL");
            //搜索的组
            map.put("group_id", "Graduate");
            //图片格式
            map.put("image_type", "BASE64");
            //图片质量要求
            map.put("quality_control", "LOW");
            //人物id
            map.put("user_id", u_id);
            //人物信息
            map.put("user_info", user_info);

            String param = GsonUtils.toJson(map);

            // 注意Param格式的编写,此处是最核心的内容,注意uid、user_info、group_id以及images的含义,详细信息看下图参数表,这里添加的图片数量可以自己权衡
            String accessToken = FaceSpot.getAuth();
            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

5.人脸识别接口

//人脸搜索
    public static String faceSearch(String img) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/search";
        try {
            Map<String, Object> map = new HashMap<>();
            //图片
            map.put("image", img);
            //活体检测
            map.put("liveness_control", "NORMAL");
            //搜索的组
            map.put("group_id_list", "Graduate");
            //图片格式
            map.put("image_type", "BASE64");
            //图片质量要求
            map.put("quality_control", "LOW");

            String param = GsonUtils.toJson(map);
            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = FaceSpot.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

6.先上传了图片,然后调用前台摄像头,截取图片,上传图片后进行搜索,确认是哪一个用户。获取他的id和信息,并跳转到页面。

package com.etc.graduate.Controller;

import com.etc.graduate.bean.user;
import com.etc.graduate.bean.usermessage;
import com.etc.graduate.services.UserMessageService;
import com.etc.graduate.services.UserService;
import com.etc.graduate.utils.FaceSpot;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.util.List;


@Controller
public class FaceLoginCheck {
    @Autowired
    private UserMessageService userMessageService;
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/FaceLoginCheck",method = RequestMethod.POST)
    @ResponseBody
    public String LoginCheck(@RequestParam("src")String src, HttpSession session){
        String score = null;
        String username = null;
        String userid=null;
        if (src == "" || src == null){
            return "false";
        }

        //先执行搜索人脸,获取到人脸对应的
        String result = FaceSpot.faceSearch(src);

        if (result != null) {
            //将result的uid取出来
            JSONObject jsonObject = new JSONObject(result);
            String result1 = jsonObject.optString("result");

            JSONObject jsonObject1 = new JSONObject(result1);
            String result2 = jsonObject1.optString("user_list");
			/*Arrya和Object是不同的,Object个适用于{}里的数据,Array
			适用[]的数据
			可以去看一下https://blog.csdn.net/qq_44807642/article/details/97767696
			*/
            JSONArray jsonArray = new JSONArray(result2);
            int length = jsonArray.length();
            for (int i = 0; i <length ; i++) {
                String string = jsonArray.optString(i);
                JSONObject jsonObject2 = new JSONObject(string);
                score = jsonObject2.optString("score");
                userid = jsonObject2.optString("user_id");
            }
        }else {
            return "false";
        }

        //使用userscore判断,超过95以上才能通过
        Double score1 = Double.valueOf(score);
        if(score1>95){
            int uid = Integer.parseInt(userid);
            //接着使用username获取数据,传入到session,传到前台
            user user = new user();
            usermessage usermessage = new usermessage();
            //使用id获取用户信息
            List<user> userList = userService.selsetUserById(uid);

            for (user anUserList : userList) {
                user = anUserList;
            }
            username = user.getUsername();
            List<usermessage> usermessageList = userMessageService.selectUserMessage(username);


            for (usermessage anUsermessageList : usermessageList) {
                usermessage = anUsermessageList;
            }


            String password = user.getUserpassword();
            String usersex = usermessage.getUsersex();
            String useremail = usermessage.getUseremail();
            String userphone = usermessage.getUserphone();
            int usercourse = usermessage.getUsercourse();
			
			//将获取到的数据存进session
            session.setAttribute("uid", uid);
            session.setAttribute("username", username);
            session.setAttribute("pwd", password);
            session.setAttribute("usersex", usersex);
            session.setAttribute("useremail", useremail);
            session.setAttribute("userphone", userphone);
            session.setAttribute("usercourse", usercourse);

            return "true";
        }else {
            return "false";
        }
    }
}

参考:https://blog.csdn.net/qq_44807642/article/details/97767696

https://www.cnblogs.com/imwtr/p/6413595.html

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值