小程序人脸识别—检测人脸图片获取图片

wxml

<view><view class="flex white"><!-- 镜头翻转 --><view bindtap="reverse">镜头翻转</view><view bindtap="clickScanCode">扫二维码</view></view><view class="head-image-box w-100 text-center position-relative"><!-- resolution:获取人脸图片后的清晰度 low:--><camera device-position="{{devicePosition ?'back': 'front'}}" class="camera" flash="off" resolution='low' /><view class="title">{{ tipsText }}1</view><image src="{{faceImage}}" mode="" /><cover-view class="cover-box" wx:if="{{isShow}}"><!-- <cover-image class="image-box" src="@/static/images/camera_verify.png"></cover-image> --><!-- cover-view 不支持动画所以只能变通的形式实现 --><!-- <cover-image :style="'transform: translateY('+translateY+'rpx);'" class="line" src="@/static/images/bg_line.png"></cover-image> --><!-- <cover-view class="line"></cover-view> --></cover-view><canvas id="myCanvas" canvas-id="myCanvas" :style="'width:'+screenWidth+'px;'+'height:'+screenHeight+'px'"></canvas></view>
</view>

js

// pages/face/index.js
Page({/*** 页面的初始数据*/data() {return {isShow: false,tipsText: '', // 错误文案提示tempImg: '', // 本地图片路径cameraEngine: null, // 相机引擎devicePosition: false, // 摄像头朝向isAuthCamera: true, // 是否拥有相机权限isVerify: false,translateY: -24,timer: null,isFlag: true,origin: null,base64: "",personId: "",isFlag2: true,screenWidth: 375,screenHeight: 640,faceImage: '', //人脸图片}},onShow: function () {this.setData({isVerify: false,tipsText: "",isFlag: true,})this.lineAnimation();},onLoad(options) {this.initData();},onUnload() {this.clearTimer();},onHide() {this.clearTimer();},clearTimer() {if (this.data.timer) {clearInterval(this.data.timer);this.setData({timer: null,})}this.setData({isFlag: false,})},// 初始化相机引擎initData() {// #ifdef MP-WEIXIN// 1、初始化人脸识别wx.initFaceDetect();// 2、创建 camera 上下文 CameraContext 对象this.setData({cameraEngine: wx.createCameraContext(),isShow: true,})// 3、获取 Camera 实时帧数据const listener = this.data.cameraEngine.onCameraFrame((frame) => {console.log(888888888, frame.data, frame.width, frame.height)if (this.data.isVerify) return//动态设置canvas的宽高,不设置会导致部分机型人脸不完整导致不能识别-----很重要!很重要!很重要!if (this.data.isFlag2) {this.setData({isFlag2: false,screenWidth: frame.width,screenHeight: frame.height,})}// 4、人脸识别,使用前需要通过 wx.initFaceDetect 进行一次初始化,推荐使用相机接口返回的帧数据wx.faceDetect({frameBuffer: frame.data,width: frame.width,height: frame.height,enablePoint: true,enableConf: true,enableAngle: true,enableMultiFace: true,success: async (faceData) => {console.log(1111, faceData)let face = faceData.faceInfo[0]if (face.x == -1 || face.y == -1) {this.setData({tipsText: '检测不到人'})}if (faceData.faceInfo.length > 1) {this.setData({tipsText: '请保证只有一个人'})} else {const {pitch,roll,yaw} = face.angleArray;const standard = 0.5if (Math.abs(pitch) >= standard || Math.abs(roll) >= standard ||Math.abs(yaw) >= standard) {this.setData({tipsText: '请平视摄像头'})} else if (face.confArray.global <= 0.8 || face.confArray.leftEye <=0.8 || face.confArray.mouth <= 0.8 || face.confArray.nose <= 0.8 ||face.confArray.rightEye <= 0.8) {this.setData({tipsText: '请勿遮挡五官'})} else {if (this.isVerify) return//人脸位置校验var centerWidth = 250;var centerHeight = 250;if (face.x > (frame.width - centerWidth) / 2 && face.x < (frame.width - centerWidth) / 2 + centerWidth && face.y > (frame.height - centerHeight) / 2 && face.y < (frame.height -centerHeight) / 2 + centerHeight) {this.setData({tipsText: '校验中...',isVerify: true})// 太快获取的人脸可能比较抽象,给用户一个准备时间setTimeout(async () => {let img = await this.changeDataToBase64(frame);this.setData({base64: img})this.searchUserFace();}, 300)} else {this.setData({tipsText: '请将人脸对准中心位置'})}}}},fail: (err) => {console.log(2222, err)if (this.isVerify) returnif (err.x == -1 || err.y == -1) {this.setData({tipsText: '检测不到人'})} else {this.setData({tipsText: err.errMsg || '网络错误,请退出页面重试'})}},})})// 5、开始监听帧数据listener.start()this.setData({listener: listener})// #endif},reverse() {let a = this.data.devicePositionthis.setData({devicePosition: !a})},clickScanCode() {// 只允许通过相机扫码// #ifdef MP-WEIXINwx.scanCode({onlyFromCamera: true,success: (res) => {var data = JSON.parse(res.result.replace(/\ufeff/g, ""));}});// #endif},changeDataToBase64(frame) {console.log(4444, frame)return new Promise((resolve, reject) => {var data = new Uint8Array(frame.data);var clamped = new Uint8ClampedArray(data);let that = this;var width = this.data.screenWidth;var height = frame.height * this.data.screenWidth / frame.width;wx.canvasPutImageData({canvasId: 'myCanvas',x: 0,y: 0,width: frame.width,height: frame.height,data: clamped,success(res) { // 转换临时文件console.log(5555, res)wx.canvasToTempFilePath({x: 0,y: 0,width: width,height: height,canvasId: 'myCanvas',fileType: 'jpg',destWidth: width,destHeight: height, // 精度修改  quality: 0.5,success(res) {console.log(666, res)// 临时文件转base64wx.getFileSystemManager().readFile({filePath: res.tempFilePath, //选择图片返回的相对路径 encoding: 'base64', //编码格式  success: res => {console.log(7777, res)// 保存base64resolve(res.data);}})},fail(res) {console.log(8888, res)reject(false);}});},fail(error) {console.log(error);}})})},searchUserFace() {// 1.人脸识别错误 把isVerify设置为true继续识别// 2.人脸识别成功,做对应的逻辑console.log(333, this.data.base64)this.setData({faceImage: 'data:image/jpeg;base64,' + this.data.base64,tipsText: '校验成功'})wx.stopFaceDetect(); //关闭人脸识别this.data.listener.stop(); //关闭camera摄像头监听returnvar params = {faceImage: this.data.base64,}searchFaces(params).then(res => {console.log(444, res)if (res.code == 200) {wx.stopFaceDetect(); //关闭人脸识别this.data.listener.stop(); //关闭camera摄像头监听this.clickPushDetail(res.data.personCode);this.setData({tipsText: '校验成功'})}}).catch(error => {setTimeout(() => {this.setData({isVerify: 'false'})}, 500)this.setData({tipsText: '暂未查找到相关人员'})})},clickPushDetail() {// 跳转到其他页面},lineAnimation() {if (this.timer) returnthis.setData({timer: setInterval(() => {this.setData({translateY: this.data.translateY + 8})if (this.data.translateY >= 460) {this.setData({translateY: 10})}}, 40)})},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh() {},/*** 页面上拉触底事件的处理函数*/onReachBottom() {},/*** 用户点击右上角分享*/onShareAppMessage() {}
})

css

/* pages/face/index.wxss */
page {background-color: #000000;
}.camera-change-image {width: 52rpx;margin-left: 40rpx;
}.scan-image {width: 48rpx;
}.update-box {color: #ffffff;
}.operation-box {position: fixed;width: 100%;bottom: calc(120rpx + env(safe-area-inset-bottom));}.icon-box {width: 76rpx;height: 76rpx;}first {width: 72rpx;height: 72rpx;
}.head-image-box {position: absolute;top: 10vh;color: white;}.camera {width: 750rpx;height: 872rpx;position: relative;z-index: 10;
}#myCanvas {position: absolute;z-index: 1;top: -10000px;
}.title {font-size: 40rpx;margin-top: 60rpx;
}.cover-box {position: absolute;top: 40%;left: 50%;transform: translate(-50%, -50%);width: 500rpx;height: 500rpx;
}.image-box {width: 100%;height: 100%;
}.line {position: absolute;top: 0rpx;left: 8rpx;right: 8rpx;width: auto;height: 30rpx;z-index: 2;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题:SpringBoot 如何自定义自己的条件注解与自动配置?

文章目录 前言自定义条件注解自定义自动配置 前言 Spring Boot的核心功能就是为整合第三方框架提供自动配置&#xff0c;而本文则带着大家实现了自己的自动配置和Starter&#xff0c;一旦真正掌握了本文的内容&#xff0c;就会对Spring Boot产生“一览众山小”的感觉。 自定义…

ArcGIS Maps SDK for JS:关闭地图边框(v4.27)

1 问题描述 近期&#xff0c;将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27&#xff0c;原本去除地图的css代码失效了。v4.27需要用.esri-view-surface--touch-none::after控制边框属性。 下面为没有关闭地图边框的效果图。&#xff08;亮色版地图为黑色边…

LeetCode-42. 接雨水【栈 数组 双指针 动态规划 单调栈】

LeetCode-42. 接雨水【栈 数组 双指针 动态规划 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;单调栈&#xff0c;维护一个单调递减栈。每当遇到当前元素大于栈顶元素就出栈&#xff0c;在出栈时更新答案。当遇到出栈的情况&#xff0c;若单调栈栈左边有一个元素则必有…

基于深度学习的Python+OpenCV的甲骨文相似度评估系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介1. 数据获取2. 深度学习模型训练3. 图像相似度评估4. 结果展示 二、功能三、系统四. 总结 一项目简介 基于深度学习的PythonOpenCV的甲骨文相似度评估系统&…

【INTEL(ALTERA)】 quartus 专业版软件 23.4 中模拟以太网子 FPGA IP 时p_ss_app_st_tx_ready 信号变为 X

问题描述 选择启用<n>前导码直通参数时&#xff0c;为什么在模拟以太网子英特尔 FPGA IP系统的 40GbE 和 50GbE Intel Agilex 7 F-Tile 变体时&#xff0c;p_ss_app_st_tx_ready 信号变为 X。 说明 由于英特尔 Quartus Prime 专业版软件 23.4 中存在一个问题&#xff…

Vue前端与后端放在一起的搭建方式

1.首先把后端项目搭建好 去到项目的存放位置 2.然后cmd黑窗口输入命令创建vue项目 3.创建成功后回到后端项目进行合并 3.1在File处选择Project Structure 3.2选择模块 3.3找到自己的vue项目 3.4疯狂next最后create 3.5选择Apply并确定OK&#xff0c;恭喜您创建成功了 二、启动…

not exists用法

not exists用法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 不容忽视的数据库利器&#xff1a;NOT EXISTS用法详解 在数据库查询中&#xff0c;我们经常会遇到…

C# URL参数编码

string s "lw123abc测试信息&#xff01;#&#xffe5;%……&*&#xff08;&#xff09;——"; Console.WriteLine("原数据:\t\t" s); String s2 Uri.EscapeDataString(s);//Uri.EscapeDataString() 编码 Console.WriteLine("Hexdata:\t&qu…

一文读懂Java中的设计模式——适配器模式,对于兼容不同系统特别适用!

适配器模式概念 适配器&#xff08;变压器&#xff09;模式&#xff1a;这种模式的核心是当你想实现一个接口但又不想实现所有接口方法&#xff0c;只想去实现一部分方法时&#xff0c;就用默认的适配器模式&#xff0c;他的方法是在接口和具体实现类中添加一个抽象类&#xf…

升级Doris集群——2.0.1.1到2.0.3版本

之前安装的Doris版本官方说不太稳定&#xff0c;所以我们可以对其进行升级 1.关闭所有节点 2.下载2.0.3版本的Doris安装包&#xff0c;将旧版本的bin和lib目录替换为 对应新版本bin和lib目录&#xff0c;按照非master节点到master节点&#xff0c;be—broker—fe的顺序进行替…

融合技术之力:跨界电商与游戏产业的无限可能

随着全球化浪潮的不断涌现&#xff0c;出海跨界电商和游戏产业逐渐成为引领科技发展的双强。本文将深入研究Socks5代理、代理IP等技术在出海跨界电商与游戏领域的技术性应用&#xff0c;揭示它们如何为企业带来更广阔的国际市场以及在游戏领域中创造更丰富的用户体验。 1. 背景…

Intewell-Hyper I_V2.0.0_release版本正式发布

新型工业操作系统_Intewell-Hyper I_V2.0.0_release版本正式发布 软件发布版本信息 版本号&#xff1a;V2.0.0 版本发布类型&#xff1a;release正式版本 版本特点 1.建立Intewell-Hyper I基线版本 版本或修改说明 基于Intewell-Lin V2.3.0_release版本&#xff1a; 1.Devel…

算法训练营Day17

110.平衡二叉树 110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 核心&#xff1a;左右子树的高度不超过1 如果不是平衡二叉树&#xff0c;则返回-1.通过是否是-1来判断是否是平衡二叉树 求高度&#xff0c;采用后续遍历。 再复习一下后续遍历的思想&#xff0c;…

在 Windows PC 上轻松下载并安装 FFmpeg

FFmpeg 是一种开源媒体工具&#xff0c;可用于将任何视频格式转换为您需要的格式。该工具只是命令行&#xff0c;因此它没有图形、可点击的界面。如果您习惯使用常规图形 Windows 程序&#xff0c;安装 FFmpeg 一开始可能看起来很复杂&#xff0c;但不用担心&#xff0c;它;很简…

淘宝、抖音、视频号直播电商“赛马”

经过多年发展&#xff0c;货架电商和社交电商在当下已是一片红海&#xff0c;因此&#xff0c;淘宝、京东、拼多多API接口等电商巨头为寻求新的增长&#xff0c;纷纷另辟蹊径&#xff0c;开始在异域探索。而由于用户如今的购物需求已经发生了天翻地覆的变化&#xff0c;于是&am…

pythom selenium Web自动化测试项目---购票系统实战

pythom selenium Web自动化测试项目—购票系统实战 环境搭建 python环境&#xff08;建议使用anaconda&#xff09; pycharm IDE集成开发工具 selenimu的安装S 安装命令&#xff1a;pip install selenium 校验环境是否搭建成功 写一个简单的demo打开浏览器看能否成功 webDriv…

中国社会科学院大学-新加坡新跃社科大学教育项目招生简章

一、项目简介 全球经济正在经历由科技进步和创新、政治和人口剧烈变化所带来的巨大的不确定性和挑战。面对日趋复杂的外部竞争环境&#xff0c;企业的领导者和管理者需要具备卓越的战略思维和全球洞察力、以科学的精神和严谨务实的态度引领企业创新发展。 为此&#xff0c;中…

IPC之七:使用 System V 共享内存段进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍共享内存(Shared Memory),因为没有像管道、消息队列这样的中介介入,所以通常认为共享内存是迄今为止最快的 IPC 方式;Linux 既支持 UNIX SYSTEM V 的共享内存,也支持 POSIX 的共享内存,本文针对 System V…

微信小程序自定义组件---behaviors

1.什么是behaviors behaviors是小程序中&#xff0c;用于实现组件间代码共享的特性&#xff0c;类似于vue中的mixins 2.behaviors的工作方式 每个behavior可以包含一组属性、数据、生命周期函数和方法。组件引用它时&#xff0c;它的属性、数据和方法会被合并到组件中。每个组…

数字孪生项目的开发平台

WEBGL 开发数字孪生项目的流程涵盖了需求分析、场景搭建、模型创建、数据接入、动画与交互、性能优化、测试与部署以及维护与升级等方面。WEBGL 开发数字孪生项目的流程可以分为以下几个步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外…