当前位置:   article > 正文

uniapp开发的App利用百度人脸实现认证功能_uniapp 调用百度云人脸识别

uniapp 调用百度云人脸识别

一:实现思路

1.方案选择

百度智能云中针对H5、APP分别提供了人脸实名认证方案,H5的实名认证根据官网指示一步步进行即可完成,主要是通过跳转实名认证H5 URL即可实现,步骤如下图所示,在这里不多介绍。

2.离线采集sdk方式

官网给出的APP集成方案主要适用于原生Android与iOS开发,而我们采用的开发工具是uniapp,所以自己集成无法实现,另一种思路是通过官网给出的离线采集sdk方式先采集到用户的照片再调用人脸实名认证的接口。

二.方案实现

1.申请离线SDK

这里申请填入基本信息即可,通过是比较快的,大概几个小时。之后新建授权用于生成离线采集SDK需要的License ID。这里填入的包名需要与打包的包名一致,签名MD5需要与打包使用的证书一致,均需要统一。

2.插件市场使用插件

这里我使用的是付费插件(https://ext.dcloud.net.cn/plugin?id=3487),可根据自身需要选择,插件选择可以实现百度SDK 离线人脸采集功能的即可。如果选择收费的插件,先导入自己的项目试用,调试成功了再购买。

3.插件使用

下载刚才百度云离线SDK下申请的Android和Ios授权文件,按照目录放入,nativeplugins文件夹没有则新建一个,名称意思代表里面放置的是原生插件。

试用的话在此处选择导入的插件,后期购买后会出现在云端插件中,这两步完成后在合适的代码处引入插件处给出代码即可,要注意代码执行顺序,先初始化再调用。人脸识别代码的调试过程需要在自定义基座中进行。

4.效果图展示

三.代码示例

1.获取认证access_token

  1. uni.request({ // 强烈建议此接口由后端访问并且维护token有效期,否则前端每次访问都会刷新token
  2. //此url为专门插件测试预览用的key和secret key, 请替换为自己申请的key
  3. url: 'https://aip.baidubce.com/oauth/2.0/token',
  4. method: 'POST',
  5. data: {
  6. grant_type: 'client_credentials',
  7. client_id: 'Tx599eMLSs2PhgKwwU4g2BXW',
  8. client_secret: 'AwGDduTh0ARBzo83BUNWQChXjD6SqPFz'
  9. },
  10. header: {
  11. "content-type": "application/x-www-form-urlencoded"
  12. },
  13. success: (res) => {
  14. this.access_token = res.data.access_token
  15. },
  16. fail: (err) => {
  17. console.log('访问失败');
  18. }
  19. });

2.插件采集人脸图片

  1. checkFace() {
  2. //初始化插件(请务必先执行一次,还原参数时也可调用)
  3. const _this = this
  4. const PPFace = uni.requireNativePlugin('PP-BaiduFaceV2');
  5. //检查权限(仅android使用)
  6. PPFace.checkRequestPermissions(res => {
  7. if (res.code == 200) {
  8. PPFace.init({
  9. androidLicenseFileName: 'idl-license.face-android',
  10. androidLicenseId: 'YlycFace-face-android', //*需要修改 android百度申请到的liceenseid
  11. iosLicenseFileName: 'idl-license.face-ios',
  12. iosLicenseId: 'YlycFace-face-ios', //*需要修改 ios百度申请到的liceenseid
  13. }, res => {
  14. console.log(res)
  15. if (res.code == 200) {
  16. //该方法参数并非每次全部要写,按需设置即可,注:该方法设置的参数在init后将重置
  17. PPFace.setFaceConfig({
  18. 'VALUE_MIN_FACE_SIZE': 200, //设置可检测的最小人脸阈值 VALUE_MIN_FACE_SIZE 默认 200
  19. 'VALUE_NOT_FACE_THRESHOLD': 0.6, // 设置可检测到人脸的阈值 VALUE_NOT_FACE_THRESHOLD 默认 0.6
  20. 'VALUE_BLURNESS': 0.3, // 设置模糊度阈值 VALUE_BLURNESS 默认 0.3
  21. 'VALUE_BRIGHTNESS': 82, // 设置光照阈值(范围0-255 仅android)VALUE_BRIGHTNESS 默认 82
  22. 'VALUE_OCCLUSION': 0.5, // 设置遮挡阈值 VALUE_OCCLUSION 默认 0.5
  23. 'VALUE_HEAD_PITCH': 8, // 设置人脸姿态角阈值 VALUE_HEAD_PITCH 默认 8
  24. 'VALUE_HEAD_YAW': 8, // 设置人脸姿态角阈值 VALUE_HEAD_YAW 默认 8
  25. 'VALUE_CLOSE_EYES': 0.7, // 设置闭眼阈值 VALUE_CLOSE_EYES 默认 0.7 ios无效
  26. 'VALUE_CACHE_IMAGE_NUM': 3, // 设置图片缓存数量 VALUE_CACHE_IMAGE_NUM 默认3
  27. 'VALUE_OPEN_MASK': true, // 设置口罩判断开关 VALUE_OPEN_MASK 默认 true
  28. 'VALUE_MASK_THRESHOLD': 0.7, // 设置口罩口罩阈值 VALUE_MASK_THRESHOLD 默认 0.7
  29. 'VALUE_SCALE': 1.0, // 原图缩放系数 VALUE_SCALE 默认 1.0
  30. 'VALUE_CROP_HEIGHT': 640, // 抠图高的设定,为了保证好的抠图效果,我们要求高宽比是43,所以会在内部进行计算,只需要传入高即可 VALUE_CROP_HEIGHT 默认640
  31. 'VALUE_CROP_ENLARGERATIO': 1.5, // 抠图人脸框与背景比例 VALUE_CROP_ENLARGERATIO 默认1.5
  32. 'VALUE_FAR_RATIO': 0.4, // 检测框远近比率 默认0.4 (v2.16新增参数)
  33. 'livenessList': ['Eye', 'Mouth', 'HeadUp', 'HeadDown',
  34. 'HeadLeft',
  35. 'HeadRight'
  36. ], //动作集合 livenessList 默认全部动作
  37. 'isLivenessRandom': false, // 设置动作活体是否随机 isLivenessRandom 默认 false
  38. 'isEnableSound': true, // 设置开启提示音 isEnableSound 默认 true
  39. 'hasBottomText': true, // 设置是否显示底部文字 默认 true
  40. 'bottomText': '— 修改了底部文字 —', // 设置底部文字内容 默认 "— 百度大脑技术支持 —"
  41. 'COLOR_BG': '#8CD790', // 背景颜色 默认 #FFFFFF
  42. 'COLOR_CIRCLE_LINE': '#77AF9C', //活体检测周围小竖线的颜色 默认 #CCCCCC
  43. 'COLOR_CIRCLE_SELECT_LINE': '#285943', //活体检测周围小竖线完成后的颜色 默认 #00BAF2
  44. 'topTextColor': '#383A3F', //顶部提示文字颜色 默认 #000000
  45. 'topSecondTextColor': '#566270', // //顶部第二行小字提示颜色 默认 #666666
  46. 'hasBottomImg': true, //是否显示底部图片 默认true(可通过替换res跟换图片)
  47. }, res => {
  48. console.log(res)
  49. })
  50. //活体识别+采集
  51. PPFace.faceliveness({
  52. livenessList: ["Eye",
  53. "Mouth",
  54. ], //活体要求动作集合,可按需删减 注意:HeadLeftOrRight新版百度已经不支持
  55. isLivenessRandom: true, //是否开启动作随机 默认false
  56. isEnableSound: true, //是否开启语音播报 默认 true
  57. isBack: false, //是否开启后置摄像头 版本2.20以后支持
  58. //以下参数目前只针对android
  59. debug: false, //是否开启Debug模式,去除遮挡,看采集框位置,默认false
  60. cameraRatio: 0.75, //设置相机预览在屏幕中的大小,默认0.75 越小,成像越小 参考:横屏0.55f,debug模式下可预览
  61. circleRatio: 0.33, //设置中间镂空圆形的半径,默认0.33 越大 圆越小 参考:横屏0.75f,非debug模式下可预览
  62. detectAreas: [15, 20, 70,
  63. 50
  64. ] //参数:[x,y,w,h] x,w参考的宽度百分比,y,h,参考的高度百分比,不传入该参数,使用系统默认采集区域,自定义采集区域,debug模式下可见
  65. }, res => {
  66. console.log(res)
  67. _this.detect(res.base64Image)
  68. //res.base64Image //全景图像 可以加前缀 data:image/jpg;base64, 进行预览
  69. //res.base64ImageCrop //裁剪后图像(少量黑边,或者没有) 可以加前缀 data:image/jpg;base64, 进行预览
  70. })
  71. //人脸采集
  72. // PPFace.recycler({
  73. // isEnableSound: true, //是否开启语音播报 默认 true
  74. // isBack: false, //是否开启后置摄像头 版本2.20以后支持
  75. // //以下参数目前只针对android
  76. // debug: false, //是否开启Debug模式,去除遮挡,看采集框位置,默认false
  77. // cameraRatio: 0.75, //设置相机预览在屏幕中的大小,默认0.75 越小,成像越小 参考:横屏0.55f,debug模式下可预览
  78. // circleRatio: 0.33, //设置中间镂空圆形的半径,默认0.33 越大 圆越小 参考:横屏0.75f,非debug模式下可预览
  79. // detectAreas: [15, 20, 70,
  80. // 50
  81. // ] //参数:[x,y,w,h] x,w参考的宽度百分比,y,h,参考的高度百分比,不传入该参数,使用系统默认采集区域,自定义采集区域,debug模式下可见
  82. // }, res => {
  83. // console.log(res)
  84. // _this.detect(res.base64Image)
  85. // //res.base64Image //全景图像 可以加前缀 data:image/jpg;base64, 进行预览
  86. // //res.base64ImageCrop //裁剪后图像(少量黑边,或者没有) 可以加前缀 data:image/jpg;base64, 进行预览
  87. // })
  88. }
  89. })
  90. }
  91. })
  92. },

3.调用人脸认证接口

  需要输入姓名身份证信息:可选择手动输入或身份证ocr识别。

  1. detect(obj) {
  2. const that = this
  3. uni.request({
  4. url: 'https://aip.baidubce.com/rest/2.0/face/v4/mingjing/verify?access_token=' + this
  5. .access_token,
  6. method: 'POST',
  7. data: {
  8. image: obj,
  9. image_type: "BASE64",
  10. id_card_number: this.form.idCard,
  11. name: this.form.lname,
  12. quality_control: "LOW",
  13. liveness_control: "LOW",
  14. spoofing_control: "LOW"
  15. },
  16. header: {
  17. "content-type": "application/json"
  18. },
  19. success: (res) => {
  20. if (res.data.error_msg) {
  21. var msg = res.data.error_msg
  22. }
  23. if (res.data.error_code) {
  24. uni.showToast({
  25. icon: 'error',
  26. title: '填写信息有误',
  27. duration: 3000
  28. })
  29. } else {
  30. if (res.data.result.score >= 80) {
  31. uni.showToast({
  32. icon: 'success',
  33. title: '人脸检测通过!',
  34. duration: 3000
  35. })
  36. that.issuccess = true
  37. } else {
  38. uni.showToast({
  39. icon: 'error',
  40. title: '人脸检测未通过!',
  41. duration: 3000
  42. })
  43. }
  44. }
  45. },
  46. fail: (err) => {
  47. console.log('访问失败:', err);
  48. uni.showToast({
  49. icon: 'none',
  50. title: '人脸检测调用失败!'
  51. })
  52. }
  53. });
  54. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/294317
推荐阅读
相关标签
  

闽ICP备14008679号