Java实现人脸识别登陆和绑定

利用百度接口

使用以下工具类

public class BaiduFaceMatchUtil {

    private static final String baseUrl = "https://aip.baidubce.com";
    private static final String accessTokenCache = "accessTokenCache";
    private static String apiKey;
    private static String secretKey;

    private static RedisUtil redisUtilNew;

    @Value("${baidu.api-key}")
    private String API_KEY;
    @Value("${baidu.secret-key}")
    private String SECRET_KEY;
    @Resource
    private  RedisUtil redisUtil;


    /**
    * @Description: 人脸对比
    * @Param: [imagesList]
    * @return: java.lang.String
    * @Author: hcc
    * @Date: 2024/5/9
    */
    public static String checkFaceMatch(List<String> imagesList) {
        try {
            if (ObjectUtil.isEmpty(imagesList) || imagesList.size() != 2) {
                log.info("人脸对比参数错误");
                throw new ApiException("人脸识别失败,请稍后再试");
            }
            List<HashMap<String, Object>> mapList = imagesList.stream().map(item -> {
                HashMap<String, Object> map = new HashMap<>();
                map.put("image", item);
                map.put("image_type", "BASE64");
                map.put("face_type", "LIVE");
                return map;
            }).collect(Collectors.toList());
            String accessToken = getAccessToken();
            return sendHttpRequest(baseUrl + "/rest/2.0/face/v3/match?access_token=" + accessToken,
                    JSONUtil.toJsonStr(mapList),
                    "application/json");
        } catch (Exception e) {
            throw new ApiException("系统异常,人脸比对失败");
        }
    }

    /**
     * 人脸检测示例方法
     * <p>
     * 本方法用于通过调用百度人脸检测API,来检测一张图片中的人脸。该方法不接受任何参数,直接返回API的响应结果。
     * 主要步骤包括:构建请求参数,发送POST请求,处理返回结果。
     *
     * @return 返回从百度人脸检测API获取的结果字符串。如果在处理过程中发生异常,则返回null。
     * @Param userFace 人脸信息,base64格式
     */
    public static String faceDetect(String userFace) {
        // 初始化请求URL
        String url = null;
        try {
            url = baseUrl + "/rest/2.0/face/v3/detect?access_token=" + getAccessToken();
        } catch (Exception e) {
            throw new ApiException("人脸检测异常!");
        }
        Map<String, Object> params = MapUtil.newHashMap();

        // 图片的标识,这里使用的是一个示例FACE_TOKEN
        params.put("image", userFace);
        // 指定返回的人脸属性,如脸型和脸型
        params.put("face_field", "faceshape,facetype");
        // 图片类型设置为FACE_TOKEN
        params.put("image_type", "BASE64");

        try {
            return sendHttpRequest(url, JSONUtil.toJsonStr(params), "application/json");
        } catch (Exception e) {
            // 异常处理,打印堆栈信息
            throw new ApiException("人脸检测失败!");
        }
    }

    /**
     * 获取AccessToken
     */
    public static String getAccessToken() throws Exception {
        String token = redisUtilNew.getCacheObject(accessTokenCache);
        if (StringUtils.isBlank(token)) {
            String url = baseUrl + "/oauth/2.0/token";
            String params = "grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey;
            String responseBody = sendHttpRequest(url, params, "application/x-www-form-urlencoded");

            // 使用 Hutool 的 JSONUtil 将 JSON 字符串解析为 JSONObject
            JSONObject jsonResponse = JSONUtil.parseObj(responseBody);

            // 从 JSONObject 中提取 access_token
            String accessToken = jsonResponse.getStr("access_token");

            redisUtilNew.setCacheObject(accessTokenCache, accessToken, 7200, TimeUnit.SECONDS);
            return accessToken;
        } else {
            return token;
        }
    }

    /**
     * 发送 HTTP 请求并返回响应体
     *
     * @param url         请求的 URL
     * @param requestBody 请求体内容
     * @param contentType 请求的内容类型
     * @return 响应体的字符串表示
     * @throws Exception 如果发送请求失败或处理响应失败
     */
    public static String sendHttpRequest(String url, String requestBody, String contentType) throws Exception {
        HttpResponse response = HttpRequest.post(url)
                .body(requestBody)
                .contentType(contentType)
                .execute();

        int statusCode = response.getStatus();
        if (statusCode >= 200 && statusCode < 300) {
            return response.body();
        } else {
            throw new ApiException("HTTP error: " + statusCode);
        }
    }

    @PostConstruct
    public void setExpDate() {
        apiKey = this.API_KEY;
        secretKey = this.SECRET_KEY;
        redisUtilNew = this.redisUtil;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值