1、引入pom文件
这里去除了百度自带的slf4j-simple日志文件

<dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.15.1</version><!-- 去除slf4j-simple依赖包-start --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions><!-- 去除slf4j-simple依赖包-end -->
</dependency>

2、创建faceUtil工具类,并添加相关方法
APP_ID在百度云控制台中创建;
API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看;
GROUP_ID是你创建的用户组名称;
IMAGE_TYPE:图片类型
BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。

import com.baidu.aip.face.AipFace;
import org.json.JSONArray;
import org.json.JSONObject;import java.util.HashMap;/*** @author 飞廉少将* @program: mcquay* @description: 百度人脸识别Aip参数和相关方法* @time 2020/8/11*/
public class FaceUtil {//设置App_id、Api_key、secret_key、group_idpublic static final String APP_ID = "*******";public static final String API_KEY = "*******";public static final String SECRET_KEY = "*******";public static final String GROUP_ID = "*******";public static final String IMAGE_TYPE = "BASE64";
//    public static final String IMAGE_TYPE = "URL";private static AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);//创建单例的原因是避免多次获取sdkpublic static AipFace getClient() {client.setConnectionTimeoutInMillis(2000);client.setSocketTimeoutInMillis(60000);return client;}private static HashMap<String, String> options = new HashMap<String, String>();public FaceUtil() {options.put("quality_control", "NORMAL");options.put("liveness_control", "LOW");}/*** 人脸注册:* 将用户照片存入人脸库中** @param image  取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串* @param userId 用户id* @return*/public static String faceRegister(String image, String userId) {JSONObject res = client.addUser(image, IMAGE_TYPE, GROUP_ID, userId, options);String faceToken = res.getJSONObject("result").getString("face_token");return faceToken;}/*** 人脸更新方法:* 1、用于对人脸库中指定用户,更新其下的人脸图像* 2、针对一个uid执行更新操作,新上传的人脸图像将覆盖此uid原有所有图像。** @param image  取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串* @param userId 用户id* @return*/public static String faceUpdate(String image, String userId) {JSONObject res = client.updateUser(image, IMAGE_TYPE, GROUP_ID, userId, options);JSONObject result = res.getJSONObject("result");String faceToken = result.getString("face_token");return faceToken;}/*** 人脸检测:* 1、检测图片中的人脸并标记出位置信息** @param image 取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串* @return*/public static Boolean faceDetect(String image) {//传入可选参数调用接口
//        options.put("face_type", "LIVE");JSONObject res = client.detect(image, IMAGE_TYPE, options);
//        JSONObject result = res.getJSONObject("result");
//        JSONObject faceList = result.getJSONArray("face_list").getJSONObject(0);
//        String faceToken = faceList.getString("face_token");if (res.has("error_code") && res.getInt("error_code") == 0) {JSONObject resultObject = res.getJSONObject("result");Integer faceNum = resultObject.getInt("face_num");return faceNum == 1 ? true : false;} else {return false;}}/*** 人脸查找:查找人脸库中最相似的人脸并返回数据* 处理:用户的匹配得分(score)大于80分,即可认为是同一个用户*/public static String faceSearch(String image) {JSONObject res = client.search(image, IMAGE_TYPE, GROUP_ID, options);if (res.has("error_code") && res.getInt("error_code") == 0) {JSONObject result = res.getJSONObject("result");JSONArray userList = result.getJSONArray("user_list");if (userList.length() > 0) {JSONObject user = userList.getJSONObject(0);double score = user.getDouble("score");if (score > 80) {return user.getString("user_id");}}}return null;}/*** 查询用户人脸列表,并返回faceToken** @param userId*/public static String faceGetlist(String userId) {// 用户人脸列表JSONObject res = client.faceGetlist(userId, GROUP_ID, options);JSONObject result = res.getJSONObject("result");JSONArray faceList = result.getJSONArray("face_list");if (faceList.length() > 0) {JSONObject user = faceList.getJSONObject(0);String faceToken = user.getString("face_token");return faceToken;}return null;}
}

3、相关方法调用
这里要注意一点:因为face_toke是唯一的,所以我在第一次人脸注册的时候,是直接将返回的face_toke存在数据对应的字段中,然后通过人脸查找方法中返回了用户id(这里的用户id是需要自己设置的,可以是id+特定规则,因为我是这样设置的),然后通过用户id查到用户信息,返回face_toke,如果face_toke和存在数据库中的相同,则登录成功

/*** @author 飞廉少将* @program: mcquay* @description: 人脸识别服务层* @time 2020/8/13*/
@Service
public class ReportFaceAipService {@Autowiredprivate ReportFaceAipClient faceAipClient;//查询当前登录用户的指纹和人脸识别状态public ResultVO<Map> queryByBiotaStatues() {ReportUser admin = this.queryUser(); //获取当前登录人信息ResultVO<ReportUser> resultVO = faceAipClient.queryByBiotaStatues(admin.getId());Map<String, Object> map = new HashMap<>();if (resultVO.getData().getFingerPrintStatus() == 0) {map.put("fingerPrintStatus", true);} else {map.put("fingerPrintStatus", false);}if (resultVO.getData().getFaceStatus() == 0) {map.put("faceStatus", true);} else {map.put("faceStatus", false);}return ResponseUtil.ok(map);}//人脸检测和人脸查找public ResultVO<String> faceDetect(MultipartFile file) {try {String encode = Base64Util.encode(file.getBytes());//人脸检测Boolean flag = FaceUtil.faceDetect(encode);if (flag) {//人脸搜索String userId = FaceUtil.faceSearch(encode);if (!StringUtils.isEmpty(userId)) {//查询人脸列表String faceToken = FaceUtil.faceGetlist(userId);return ResponseUtil.ok(faceToken);} else {return ResponseUtil.fail("000", "无法识别面部信息,请重试!!!");}} else {return ResponseUtil.fail("000", "无法识别面部信息!!!");}} catch (IOException e) {e.printStackTrace();return ResponseUtil.serious();}}//人脸注册public ResultVO<Boolean> faceRegister(MultipartFile file) {try {ReportUser user = this.queryUser();String userId = user.getId() + "_mcquay";String encode = Base64Util.encode(file.getBytes());Boolean flag = FaceUtil.faceDetect(encode);if (flag) {String faceToken;BiotaInfoVO infoVO = new BiotaInfoVO();infoVO.setId(user.getId());infoVO.setFaceStatus(true);if (!StringUtils.isEmpty(user.getFaceToken())) {faceToken = FaceUtil.faceUpdate(encode, userId);infoVO.setFaceToken(faceToken);} else {faceToken = FaceUtil.faceRegister(encode, userId);infoVO.setFaceToken(faceToken);}ResultVO<Boolean> resultVO = this.faceAipUpdate(infoVO);return resultVO;} else {return ResponseUtil.fail("000", "无法识别面部信息!!!");}} catch (Exception e) {e.printStackTrace();return ResponseUtil.serious();}}
}

4、登录

/*** @author 飞廉少将* @program: mcquay* @description: 人脸识别及指纹相关方法 前端控制器* @time 2020/8/13*/
@RestController
@RequestMapping("/web/faceAip")
@Validated
@Api(tags = "人脸识别登录相关方法")
public class WebFaceAipController {@Autowiredprivate ReportFaceAipService faceAipService;//人脸检测和人脸查找@ApiOperation(value = "人脸检测和人脸查找", httpMethod = "POST")@PostMapping(value = "/faceDetect", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public ResultVO<String> faceDetect(@RequestPart(required = false, value = "file") MultipartFile file) {return faceAipService.faceDetect(file);}//人脸注册并更新当前登录用户信息@ApiOperation(value = "人脸注册或更新当前登录用户脸部信息", httpMethod = "POST")@PostMapping(value = "/faceRegister", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public ResultVO<Boolean> faceRegister(@RequestPart(required = false, value = "file") MultipartFile file) {return faceAipService.faceRegister(file);}@ApiOperation(value = "关闭人脸识别", notes = "关闭人脸识别")@PostMapping("/faceAipUpdate")public ResultVO<Boolean> faceAipUpdate(@RequestBody BiotaInfoVO biotaInfoVO) {//获取当前登录用户信息Subject subject = SecurityUtils.getSubject();ReportUser user = (ReportUser) subject.getPrincipals().asList().get(0);//查询用户实时信息WebUserDetailVO data = userService.queryById().getData();if (data.getFaceToken().equals(biotaInfoVO.getFaceToken())) {biotaInfoVO.setId(user.getId());return faceAipService.faceAipUpdate(biotaInfoVO);}else {return ResponseUtil.fail("000","面部信息识别失败!!!");}}@PostMapping("/fingerPrintLogin")@ApiOperation(value = "指纹或人脸识别登录", notes = "指纹或人脸识别登录")public Object fingerPrintLogin(@RequestBody String body, HttpServletRequest request) {String type = JacksonUtil.parseString(body, "type");ReportUser reportUser;if (Integer.valueOf(type) == 1) {String fingerPrint = JacksonUtil.parseString(body, "fingerPrint");reportUser = faceAipService.queryByFingerPrint(fingerPrint);} else {String faceToken = JacksonUtil.parseString(body, "faceToken");reportUser = faceAipService.queryByFaceToken(faceToken);}if (reportUser == null) {return ResponseUtil.fail("000", "找不到相关信息,请使用账号密码登录!!!");} else {Subject currentUser = SecurityUtils.getSubject();try {currentUser.getSession().setTimeout(2592000000L);currentUser.login(new UsernamePasswordToken(reportUser.getUserAccount(), reportUser.getUserPassword()));} catch (UnknownAccountException uae) {uae.printStackTrace();logHelper.logAuthFail("登录", "找不到相关指纹或人脸信息,请使用账号密码登录!!!!!!");return ResponseUtil.fail(WebResponseCode.AUTH_INVALID_ACCOUNT, "找不到相关指纹或人脸信息,请使用账号密码登录!!!");} catch (LockedAccountException lae) {lae.printStackTrace();logHelper.logAuthFail("登录", "用户帐号已锁定或密码已过期不可用");return ResponseUtil.fail(WebResponseCode.AUTH_INVALID_ACCOUNT, "用户帐号已锁定或密码已过期不可用");} catch (AuthenticationException ae) {ae.printStackTrace();logHelper.logAuthFail("登录", "认证失败");return ResponseUtil.fail(WebResponseCode.AUTH_INVALID_ACCOUNT, "认证失败");}currentUser = SecurityUtils.getSubject();ReportUser admin = (ReportUser) currentUser.getPrincipal();logHelper.logAuthSucceed("登录");//将token存入redisBusinessTokenManager.saveToken(admin.getId(), currentUser.getSession().getId().toString());// userInfoMap<String, Object> adminInfo = new HashMap<String, Object>();adminInfo.put("acount", admin.getUserAccount());adminInfo.put("avatar", admin.getPic());adminInfo.put("realname", admin.getUserName());adminInfo.put("deptIds", admin.getDeptIds());adminInfo.put("deptNames", admin.getDeptNames());adminInfo.put("userMobile", admin.getUserMobile());adminInfo.put("roleId", admin.getRoleId());adminInfo.put("roleName", admin.getRoleName());adminInfo.put("pid", admin.getPid());adminInfo.put("pname", admin.getPname());adminInfo.put("faceToken",admin.getFaceToken());Map<Object, Object> result = new HashMap<Object, Object>();//添加日志记录ResultVO<Integer> resultVO = integralLogService.userIntegralLog(admin, 1);if (resultVO.getData() > 0) {result.put("integralLog", true);}else {result.put("integralLog",resultVO.getData());}result.put("token", currentUser.getSession().getId());result.put("adminInfo", adminInfo);return ResponseUtil.ok(result);}}}

Java_百度人脸识别登录相关推荐

  1. php百度人脸识别做登陆,php调用百度人脸识别接口查询数据库人脸信息实现验证登录功能...

    博主在进行鼎食城毕业设计时,需要实现一个人脸识别登录功能,想到可以利用百度的人脸识别接口来完成,于是便去下载了百度的识别SDK,我用的是PHP,需要的的可以去下载其他版本,以下是识别效果: 用户在开始 ...

  2. JavaWeb使用百度人工智能API实现人脸识别登录,人脸注册

    1.JavaWeb使用百度API实现人脸识别 本篇博客使用的环境是SSM+Maven+JSP实现人脸识别登录,适合于JavaWeb的开发(其他语言也可以作为参考),我会从注册百度云账号,前台如何调用摄 ...

  3. php 人脸识别接口,php调用百度人脸识别接口查询数据库人脸信息实现验证登录功能...

    博主在进行鼎食城毕业设计时,需要实现一个人脸识别登录功能,想到可以利用百度的人脸识别接口来完成,于是便去下载了百度的识别SDK,我用的是PHP,需要的的可以去下载其他版本,以下是识别效果: 用户在开始 ...

  4. 借助百度云平台人脸识别sdk完成网页人脸识别登录demo

    最近在浏览百度云平台人工智能相关产品时,萌生了做一个网页人脸识别登录的demo. 以下是前端代码: 实现在浏览器调用摄像头,捕捉图片后上传到服务器验证. <!DOCTYPE html> & ...

  5. iOS 使用百度的人脸识别登录验证,解决认证失败不跳转界面连续认证,认证相似度对比...

    在使用百度人脸识别出现的问题:小米6调用摄像机是黑白的一个情况,iOS上会出现识别准确性上的问题(多次代开认证,会通过) 人脸识别(活体验证): 1.芝麻认证 : 0.4元/次,需要企业企业认证.不能 ...

  6. flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...

    baidu_face_plugin 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android) 使用方式 注册百度开发者账号 前往 百度开发者账号 进行注册. 申请并配置licen ...

  7. PC人脸识别登录,出乎意料的简单

    之前不是做了个开源项目嘛,在做完GitHub登录后,想着再显得有逼格一点,说要再加个人脸识别登录,就我这佛系的开发进度,过了一周总算是抽时间安排上了. 源码在文末 其实最近对写文章有点小抵触,写的东西 ...

  8. vue 拍照人脸识别_安排上了!PC人脸识别登录,出乎意料的简单

    推荐阅读: 微服务实战文档分享,阿里内部的Spring cloud微服务精髓都在里面 去面试3W月薪的Java岗位,被虐哭了,原来是我这些技术点还有欠缺 春招失厉,狂刷200+面试文档,终斩获头条,阿 ...

  9. java人脸识别_自从加了PC人脸识别登录功能,网站立马显得高大上

    之前不是做了个开源项目嘛,在做完GitHub登录后,想着再显得有逼格一点,说要再加个人脸识别登录,就我这佛系的开发进度,过了一周总算是抽时间安排上了. 源码在文末 其实最近对写文章有点小抵触,写的东西 ...

最新文章

  1. 每日一皮:看图猜一个数据库连接池!
  2. Unet实现图像分割(二)
  3. showModalDialog详解
  4. OpenCV3特征提取与目标检测之HOG(二)——使用官方的行人分类器实现行人检测
  5. 【ES】Mac 下安装ES 报错 Failed to create native process factories for Machine Learning
  6. GraphicsStatsService之2 UI绘制的时间信息来源
  7. 《中国人工智能学会通讯》——6.7 实体链接任务及系统
  8. Netty游戏服务器二
  9. 【滤波器】基于多种滤波器实现信号去噪含Matlab源码
  10. 【OpenCV】- 分水岭算法
  11. 【html】理工男李峋的极致浪漫:爱心代码|和你的心跳同频共振
  12. Android的涂鸦智能设备几种入网方式
  13. 精尽 Dubbo 源码分析 —— API 配置
  14. 在MatLab中FFT和IFFT的互相转换
  15. php中的如何将拼接到一起,如何将两个视频拼接在一起?视频拼接方法
  16. 行人重识别通用数据集及介绍
  17. 泰勒公式浅谈原理(转)
  18. 金电联行:大数据征信、大数据风险量化、大数据信用融资 | 百万人学AI评选
  19. TMS320DM8148CPCI卡学习资料第193篇:基于TI 达芬奇DSP TMS320DM8148音视编解码与存储6U-CPCI卡设计方案
  20. 电气二次接线岂能胡乱连接

热门文章

  1. I2C 协议抓包,学习,总结
  2. 论文笔记:Corners for layout: End-to-end layout recovery from 360 images(CFL EquiConvs)(RAL 2020)
  3. Android中wifi与数据流量的切换监听
  4. github常见错误集合 [rejected] main -> main (non-fast-forward) Failed to connect to github.com por
  5. 为什么有人就是不信35岁以后多数人都会失业?让你们看看我真实的经历,有图有真相
  6. 初识Animate.css
  7. BOOST库介绍,安装
  8. KodExplorer可道私有云——建立自己的私有云储存服务
  9. MySQL数据库和Redis数据库
  10. python判断平年闰年的方法_平年和闰年的三种判断方法