简单示例
(1)百度云注册
(2)人脸识别
(3)添加应用获取认证参数
(4)添加依赖
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.8.0</version>
</dependency>
(5)示例代码
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.util.Base64Util;
/**
* AI-人脸识别
*
* @author vander
* @date 2019年4月12日
*/
public class TestFace {
private AipFace client;
@Before
private void init() {
//百度云上注册获取
client = new AipFace("","","");
}
//人脸检测:判断图片是否有脸部信息
@Test
public void faceCheck() throws IOException {
String path = "";//图片绝对地址
byte[] bytes = Files.readAllBytes(Paths.get(path));
String image = Base64Util.encode(bytes);
JSONObject res = client.detect(image, "BASE64", null);
System.err.println(res.toString(2));
}
//人脸注册/更新:本地所有用户照片注册到百度云
@Test
public void faceReg() throws Exception {
//参数设置
HashMap<String, String> options = new HashMap<>();
options.put("quality_control", "NORMAL");//图片质量
options.put("liveness_control","LOW");//活体检测
String path = "";//图片绝对地址
byte[] bytes = Files.readAllBytes(Paths.get(path));
String image = Base64Util.encode(bytes);
/**
* 调用api方法完成人脸注册
*
* 上传图片格式:url、base64
* 组ID
* 用户ID
* 基本参数配置
*/
// JSONObject res = client.addUser(image, "BASE64", "plxc", "10001", options);//添加
JSONObject res = client.updateUser(image, "BASE64", "plxc", "10001", options);//更新
System.err.println(res);
}
//人脸搜索:人脸登录获取用户信息
@Test
public void faceSearch() throws IOException {
String path = "";//图片绝对地址
byte[] bytes = Files.readAllBytes(Paths.get(path));
String image = Base64Util.encode(bytes);
JSONObject res = client.search(image, "BASE64", "plxc", null);
//获取到user_list,通过上传的图片匹配到相识度最高的几个用户信息(评分<80分以上为同一人>、组ID、用户ID),
//一般获取数组第一条记录(评分最高的)
System.err.println(res);
}
}
参数/响应说明
请求参数:
image:图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断。
image_type:图片类型 BASE64:图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的
FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
group_id:用户组id(由数字、字母、下划线组成),长度限制128B。
user_id:用户id(由数字、字母、下划线组成),长度限制128B。
user_info:用户资料,长度限制256B。
quality_control:图片质量控制 NONE: 不进行控制 LOW:较低的质量要求NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认NONE。
liveness_control:活体检测控制 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝
率 低通过率) 默认NONE。
响应参数:
log_id 是 uint64 请求标识码,随机数,唯一
face_token 是 string 人脸图片的唯一标识
location 是 array 人脸在图片中的位置
+left 是 double 人脸区域离左边界的距离
+top 是 double 人脸区域离上边界的距离
+width 是 double 人脸区域的宽度
+height 是 double 人脸区域的高度
+rotation 是 int64 人脸框相对于竖直方向的顺时针旋转角,[-180,180]
业务使用
流程
(1)登录界面提供二维码入口
(2)用户使用手机扫描二维码,(唯有微信授权,建议使用浏览器)
(3)识别二维码打开页面,授权使用摄像头,进行人脸识别
(4)后台调用api进行人脸信息获取,成功进入系统
代码
响应实体类
@Data
@NoArgsConstructor
@ToString
public class FaceLoginResult implements Serializable {
private static final long serialVersionUID = -1616426041373762391L;
/**
* 二维码使用状态
* -1:未使用
* 0:失败
* 1:登录成功(返回用户id和token)
*/
private String state;
/**
* 登录信息
*/
private String token;
/**
* 用户ID
*/
private String userId;
public FaceLoginResult(String state, String token, String userId) {
this.state = state;
this.token = token;
this.userId = userId;
}
public FaceLoginResult(String state) {
this.state = state;
}
}
获取刷脸登录二维码
//创建二维码
public QRCode getQRCode() throws Exception {
//1.创建唯一标识
String code = idWorker.nextId() + "";
//2.生成二维码(url地址)
String content = url+"?code="+code;
System.out.println(content);
String file = QRCodeUtil.crateQRCode(content);
System.out.println(file);
//3.存入当前二维码状态(存入redis)
FaceLoginResult result = new FaceLoginResult("-1");
redisTemplate.boundValueOps(getCacheKey(code)).set(result,10, TimeUnit.MINUTES);//状态对象,失效时间,单位
return new QRCode(code,file);
}
页面轮询获取登录状态
public FaceLoginResult checkQRCode(String code) {
String key = getCacheKey(code);
return (FaceLoginResult) redisTemplate.opsForValue().get(key);
}
图像检测
/**
* 图像检测,判断图片中是否存在面部头像
*/
@RequestMapping(value = "/checkFace", method = RequestMethod.POST)
public Result checkFace(@RequestParam(name = "file") MultipartFile attachment) throws Exception {
String image = Base64Util.encode(attachment.getBytes());
Boolean aBoolean = baiduAiUtil.faceCheck(image);
if (aBoolean) {
return new Result(ResultCode.SUCCESS);
}else{
return new Result(ResultCode.FAIL);
}
}
人脸登录,上传图片
public String loginByFace(String code, MultipartFile attachment) throws Exception {
//1.调用百度云AI查询当前的用户
String userId = baiduAiUtil.faceSearch(Base64Util.encode(attachment.getBytes()));
//2.自动登录(token)
FaceLoginResult result = new FaceLoginResult("0");
if(userId != null) {
//自己模拟登录
//查询用户对象
User user = userDao.findById(userId).get();
if(user != null) {
//获取subject
Subject subject = SecurityUtils.getSubject();
//调用login方法登录
subject.login(new UsernamePasswordToken(user.getMobile(),user.getPassword()));
//获取token(sessionId)
String token = subject.getSession().getId()+"";
result = new FaceLoginResult("1",token,userId);
}
}
//3.修改二维码的状态
redisTemplate.boundValueOps(getCacheKey(code)).set(result,10,TimeUnit.MINUTES);
return userId;
}
1079

被折叠的 条评论
为什么被折叠?



