扩展_AI_人脸登录

简单示例

(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值