利用百度接口
使用以下工具类
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;
}
}