小程序人脸分析

公司的业务需求是用户在使用某个功能前,必须使用人脸识别,确保当前使用人是用户本人,防止某些功能乱用。后端用的是腾讯的人脸识别方案,这里只是前端的识别代码,保证人脸剧中,大小合适,有一个人脸以上

小程序代码,主要利用的是wx.createVKSession这个API来实现,样式部分可自行修改

这部分代码只是小程序前端识别的代码,真正的人脸比对代码是在后端,需要前端识别到人脸后上传到后端进行比对。
部分位置可根据业务需求要样式来修改,这里只是我自己调整的位置

wxml

<view class="title">{{verifyText}}</view>
<view class="container">
<image src="{{faceImg}}" wx:if="{{faceImg}}" class="faceImg" mode="widthFix"/>
  <camera class="camera" device-position="front"  flash="off"></camera>
</view>

js部分


let listener = null;
let videoCtx = null;
let VKSession = null;
let faceVerifyTime = null; //面容验证倒计时

Page({
  data: {
    faceImgHeight: 314,
    faceImgWidth: 314,
    face: {
      origin: {
        x: 0,
        y: 0
      },
      size: {
        width: 0,
        height: 0
      },
      points:[]
    },
    verifyText:"请移动面容到框内",
    isCentre:false, //是否面容在正中间
    startVerify:false, //是否正在验证
    faceImg:"", //面容图片地址
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad() {
    this.getAuthSetting(); //获取权限
    
    this.initFaceVerify()
  },
  getAuthSetting(){
    wx.getSetting({
      success :(res)=> {
        if(!res.authSetting['scope.camera']){
          wx.showModal({
            title: '请允许获取摄像头权限',
            showCancel:false,
            complete: (modalRes) => {
              if (modalRes.confirm) {
                wx.openSetting({
                  success:(settingRes)=>{
                    if(!settingRes.authSetting['scope.camera']){
                      this.getAuthSetting()
                    }else{
                      wx.navigateBack()
                    }
                  }
                })
              }
            }
          })
        }
      }
    })
  },
  initFaceVerify(){
    videoCtx = null;
    listener=null;
    VKSession=null;
    videoCtx = wx.createCameraContext();
    let count = 0;
    listener = videoCtx.onCameraFrame((frame) => {
      count++;
      if (count === 5) {
        this.detectFace(frame);
        count = 0;
      }
    });
    VKSession = wx.createVKSession({
      version: 'v1',
      track: {
        plane: {
          mode: 1
        },
        face: {
          mode: 2
        }
      }
    });
    VKSession.on('updateAnchors', (anchors) => {
      // 有面容
      console.log(anchors,'有面容')
     
      if(this.data.startVerify){
        return;
      }
      let anchor = anchors[0];
        this.setData({
          face: {
            points: anchor.points,
            origin: anchor.origin,
            size: anchor.size
          }
        },()=>{
          this.isFaceCentered()
        })
    })
    VKSession.on('removeAnchors', (anchors) => {
      // 面容消失
      if(this.data.startVerify){
        return;
      }
      this.setData({
        verifyText:'请移动面容到框内',
        isCentre:false,
        face:{}
      },()=>{
        clearTimeout(faceVerifyTime)
        faceVerifyTime = null;
      })
    })
    setTimeout(() => {
      // 直接开始
      this.handleStart()
    }, 500);
  },
  onUnload() {
    VKSession.destroy();
  },
  picture(){
    this.setData({
      startVerify:true
    },()=>{
      clearTimeout(faceVerifyTime)
      faceVerifyTime = null;
      videoCtx.takePhoto({
        quality:'original',
        success:(e)=>{
          //上传照片接口,图片换成远端url地址 自行替换
          uploadImage(e.tempImagePath).then((res)=>{
            this.setData({
              faceImg:res
            })
            wx.showLoading({
              title: '正在验证',
            })

            try {
              // 执行后端分析人脸
              api({
                img:res
              }).then((writeoffRes) => {
                //识别成功
                //自行处理识别成功结果
              }).catch(err => {
                wx.hideLoading();
                wx.showModal({
                  title: err.msg,
                  showCancel:false,
                  confirmText:'重新核验',
                  complete: (res) => {
                    if (res.confirm) {
                      this.setData({
                        startVerify:false,
                        faceImg:"",
                        verifyText:'请移动面容到框内',
                        isCentre:false,
                        face:{}
                      },()=>{
                        this.handleStart()
                      })
                    }
                  }
                })
              })
            } catch (error) {
              console.log(error)
            }
          }).catch(()=>{
            this.setData({
              startVerify:false,
              faceImg:"",
              verifyText:'请移动面容到框内',
              isCentre:false,
              face:{}
            },()=>{
              this.handleStart()
              wx.showToast({
                title: '网络连接失败,请重试',
              })
            })
          })
        }
      })
    })
    
  },
  handleStart() {
    VKSession.start((errno) => {
      console.warn('VKSession.start errno', errno);
    });
    listener.start();
  },
  handleStop() {
    listener.stop({
      complete: (res) => {
        console.warn('listener.stop', res);
      }
    });
    VKSession.stop();
  },
  async detectFace(frame) {
    // 获取面容
      VKSession.detectFace({
        frameBuffer: frame.data,
        width: frame.width,
        height: frame.height,
        scoreThreshold: 0.8,
        sourceType: 0,
        modelMode: 2
      });
  },
  isFaceCentered() {
    // 判断面容是否在中间
    if(!this.data.face.points){
      return;
    }
    let points = this.data.face.points[43]; //位置
    let size = this.data.face.size; //大小
    if(points.x>0.65||points.x<0.4||points.y>0.65||points.y<0.35){
      this.setData({
        verifyText:'请移动面容到框内',
        isCentre:false,
        face:{}
      },()=>{
        clearTimeout(faceVerifyTime)
        faceVerifyTime = null;
      })
      return
    }else if(size.width>0.95||size.width<0.32){
      this.setData({
        verifyText:'请移动面容显示完整面容',
        isCentre:false,
        face:{}
      },()=>{
        clearTimeout(faceVerifyTime)
        faceVerifyTime = null;
      })
      return
    }
    this.setData({
      verifyText:'请保持不动',
      isCentre:true
    },()=>{
      this.verifyCentre()
    })
  },
  verifyCentre(){
    // 开始验证面容
    if(faceVerifyTime||this.data.startVerify){
      return
    }else{
      faceVerifyTime = setTimeout(() => {
        if(this.data.isCentre){
            this.handleStop()
            this.picture()
        }else{
          clearTimeout(faceVerifyTime)
          faceVerifyTime = null;
        }
      }, 1500);
    }
  }
})

style

.container {
  position: relative;
  padding: 200rpx 0;
}
.title{
  position: absolute;
  width: 100%;
  text-align: center;
  padding-top: 100rpx;
  font-size: 36rpx;
}
.camera{
  width: 600rpx;
  height: 600rpx;
  border-radius: 50% 50%;
  margin: 0 auto;
}
.faceImg{
  width: 600rpx;
  height: 600rpx;
  border-radius: 50% 50%;
  margin: 0 auto;
  position: absolute;
  z-index: 999;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/754045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算:重塑数字时代的基石

目录 一、引言 二、云计算的定义与特点 三、云计算的发展历程 四、云计算的应用场景 五、云计算面临的挑战 六、云计算的未来发展趋势 七、结语 一、引言 随着信息技术的飞速发展&#xff0c;云计算已经逐渐渗透到我们生活的方方面面。从个人用户的在线存储、在线办公&…

从零开始:Spring Boot 中使用 Drools 规则引擎的完整指南

规则引擎作用 规则引擎主要用于将业务逻辑从应用程序代码中分离出来&#xff0c;提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策&#xff0c;从而实现业务逻辑的自动化和动态调整。 例如 门店信息校验&#xff1a;美团点评在门店信息…

遥感数据并行运算(satellite remote sensing data parallell processing)

文章内容仅用于自己知识学习和分享&#xff0c;如有侵权&#xff0c;还请联系并删除 &#xff1a;&#xff09; 之前不太会用&#xff0c;单纯想记录一下&#xff0c;后面或许还会用到 1. 教程 [1] Pleasingly Parallel Programming: link 1.1 处理器&#xff0c;核和线程 …

使用容器部署redis_设置配置文件映射到本地_设置存储数据映射到本地_并开发java应用_连接redis---分布式云原生部署架构搭建011

可以看到java应用的部署过程,首先我们要准备一个java应用,并且我们,用docker,安装一个redis 首先我们去start.spring.io 去生成一个简单的web项目,然后用idea打开 选择以后下载 放在这里,然后我们去安装redis 在公共仓库中找到redis . 可以看到它里面介绍说把数据放到了/dat…

Ansys Zemax|在设计抬头显示器(HUD)时需要使用哪些工具?

附件下载 联系工作人员获取附件 汽车抬头显示器或汽车平视显示器&#xff0c;也被称为HUD&#xff0c;是在汽车中显示数据的透明显示器&#xff0c;不需要用户低头就能看到他们需要的重要资讯。这个名字的由来是由于该技术能够让飞行员在头部“向上”并向前看的情况下查看信息…

第五节:如何使用其他注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上节我们实践了通过Bean方式声明Bean配置。咱们这节通过Component和ComponentScan方式实现一个同样功能。这节实现的效果是从IOC中加载Bean对象&#xff0c;并且将Bean的属性打印到控制台。 第一步&#xff1a;创建pojo实体类studen…

人工智能AI风口已开:如何赋予UI设计与视频剪辑新生命

随着科技的浪潮不断向前推进&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度重塑着我们的世界&#xff0c;特别是在创意产业的核心领域——UI设计与视频剪辑中&#xff0c;AI正逐步成为驱动行业创新与变革的关键力量。在这个AI技术全面开花的新时代&#xff0c;…

搭建企业内网pypi镜像库,让python在内网也能像互联网一样安装pip库

目录 知识点实验1.服务器安装python2.新建一个目录/mirror/pip&#xff0c;用于存储pypi文件&#xff0c;作为仓库目录3.下载python中的所需包放至仓库文件夹/mirror/pip3.1. 新建requirement.py脚本&#xff08;将清华pypi镜像库文件列表粘贴到requirement.txt文件中&#xff…

Hadoop版本演变、分布式集群搭建

Hadoop版本演变历史 Hadoop发行版非常的多&#xff0c;有华为发行版、Intel发行版、Cloudera Hadoop(CDH)、Hortonworks Hadoop(HDP)&#xff0c;这些发行版都是基于Apache Hadoop衍生出来的。 目前Hadoop经历了三个大的版本。 hadoop1.x&#xff1a;HDFSMapReduce hadoop2.x…

mtu 1500 qdisc noop state DOWN group default qlen 1000问题的解决

问题描述 1、打开虚拟机终端&#xff0c;root身份启动ens网卡&#xff08;一般情况下还是会直接报错 ifup ens33 2、停止网卡设置disable再启动 systemctl stop NetworkManager 不报错即可 systemctl disable NetworkManagerservice network restart出现了绿色的OK啦&#…

流水线作业模拟程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 流水线作业模拟 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int Count 0;private bool IsStop false;private void uiLight1_Click(object sender, EventArgs e…

某麦网自动刷新抢票脚本——手机端(高级版)

某麦网自动刷新抢票脚本——电脑端 小白操作-抵制黄牛–需要更好用更高级关注获取 如何用Python自动抢大麦网演出票&#xff1f; 在数字化时代&#xff0c;购票已经成为我们生活的一部分&#xff0c;无论是音乐会、话剧、体育赛事还是各种展览&#xff0c;抢票几乎成了一项“…

[每周一更]-(第103期):GIT初始化子模块

文章目录 初始化和更新所有子模块分步骤操作1. 克隆包含子模块的仓库2. 初始化子模块3. 更新子模块 查看子模块状态提交子模块的更改处理子模块路径错误的问题 该问题的缘由是因为&#xff1a;在写某些代码的时候&#xff0c;仓库中有些文件夹&#xff0c;只提交了文件夹名称到…

C# SocketUDP服务器,组播

SocketUDP 自己即是服务器又是客户端 &#xff0c;在发消息只需要改成对方ip和端口号即可 前提对方必须开启服务器 socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.72"), 8080)); 控件&#xff1a;Button,TextBox,RichTextBox 打开自己服务器 public…

六、资产安全—信息分级资产管理与隐私保护(CISSP)

目录 1.信息分级 2.信息分级方法 3.责任的层级 4.资产管理 5.隐私数据管理角色 6.数据安全控制 7.数据保护方案 8.使用安全基线 六、资产安全—数据管理(CISSP): 五、身份与访问管理—身份管理和访问控制管理(CISSP): 1.信息分级 信息分级举列: 2.信息分级方…

Halcon 文本文件操作,形态学

一文件的读写 *******************************************************向文本文件写入字符串内容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…

记录一下MATLAB优化器出现的问题和解决

今天MATLAB优化器出了点问题。我想了想&#xff0c;决定解决一下&#xff0c;不然后面项目没有办法进行下去。 我忘了截图了。 具体来说&#xff0c;是出现了下面的问题。 Gurobi: Cplex: 在上次为了强化学习调整了Pytoch环境以后&#xff08;不知道是不是这个原因&#…

Mac(M1芯片)安装多个jdk,Mac卸载jdk

1.jdk下载 oracle官方链接&#xff1a;oracle官方下载链接 2.安装 直接下一步&#xff0c;下一步就行 3.查看是否安装成功 出现下图内容表示安装成功。 4.配置环境变量 open -e .bash_profile 路径建议复制过去 #刷新环境变量 source ~/.bash_profile 5.切换方法 6.jdk…

页分裂和页合并——Java全栈知识(33)

上篇文章我们讲到了 MySQL 的数据页&#xff0c;我们说到了 InnoDB 的索引是以 B树的形式构建的&#xff0c;而且 B树的节点都是一个数据页。 但是 B树在使用过程中难免会有节点分裂和节点合并的过程。 因为我们是以数据页为基本单位构造的 B树&#xff0c;那么 B树的节点分裂和…

火锅食材配送小程序的作用有什么

火锅店、麻辣烫店、餐厅等对火锅丸子食材的需求量很高&#xff0c;还有普通消费者零售等&#xff0c;市场中或城市里总是有着较为知名的食材店或厂商&#xff0c;通过产品质量、口碑、宣传、老客复购等获得更多生意营收。 线下生意放缓&#xff0c;需要商家拓宽渠道。运用雨科…