当前位置: 首页 > article >正文

uniapp实现人脸识别(不使用三方插件)

uniapp实现人脸识别

    • 内容简介
    • 功能实现
      • 上传身份证
      • 进行人脸比对
    • 遇到的问题

内容简介

1.拍摄/相册将身份证照片上传到接口进行图片解析
2.使用live-pusher组件拍摄人脸照片,上传接口与身份证人脸进行比对

功能实现

上传身份证

先看下效果

请添加图片描述请添加图片描述

点击按钮调用chooseImageAPI进行图片的上传

// 上传按钮的loading以及disabled状态,避免多次上传
const loading = ref(false)
// 上传按钮事件
const chooseIdCard = () => {uni.chooseImage({success: (tempFiles) => {// 获取到当前图片路径并调用上传方法uploadIdCard(tempFiles.tempFilePaths[0])}})
}
// 身份证图片上传
const uploadIdCard = async (stream: (ArrayBuffer | string)) => {loading.value = trueuni.uploadFile({url: '/cardInfo/uploads', // 你的上传接口地址filePath: stream,         // 选中的图片name: 'file',             // 与后端协定的keysuccess: ({data, statusCode }) => {if(statusCode == 200){// 这里需要注意下,接口返回的事string,需要解析后才可正常使用const result = JSON.parse(data)if(result.code == 200 || result.success == true){// 这里写上传成功的逻辑// 我要将数据存在store中 给后面的页面使用loading.value = falseconst memberStore = useMemberStore()memberStore.setPersonInfo(result.data)uni.navigateTo({url:'/pages/face/face',})}else{uni.showToast({icon: 'error',title: result.msg})}}},fail: (err) => {console.error(err);uni.showToast({icon: 'error',title: '上传失败fail!'})}});
}

进行人脸比对

请添加图片描述
live-pusher组件实现摄像头调起以及样式的实现,在之前的文章有记录,点击查看,
这里主要描述该组件截图上传的部分

<template><cover-view class="pushContent"><live-pusher id="pusherFaceId" ref="pusherRef" class="livePusher"aspect="1:1" :whiteness="1" :beauty="1" device-position="front"/><cover-image class="pusherImg" src="/static/images/faceRadio.png" alt=""></cover-image></cover-view>
</template>
<script lang="ts" setup>const pusherContext = ref()onMounted(() => {// 获取当前组件实例const instance = getCurrentInstance() as ComponentInternalInstance;// 创建 live-pusher 上下文 livePusherContext 对象。// 这是要用实例的proxy代理对象pusherContext.value = uni.createLivePusherContext("pusherFaceId", instance.proxy)// 开启摄像头预览pusherContext.value.startPreview({success: () => {// 人脸拍摄上传faceRecognition()}});})const faceRecognition = () => {pusherContext.value.snapshot({success: (res: UniHelper.LivePusherProps) => {uploadFace(res.message.tempImagePath)},})}const uploadFace = (stream) => {uni.uploadFile({url: '/cardInfo/faceUploads',filePath: stream,name: 'file',// 额外的参数formData: {cardToken: memberStore.personInfo.cardToken},success: ({data, statusCode }) => {if(statusCode == 200){const result = JSON.parse(data)if(result.code == 200 || result.success == true){const memberStore = useMemberStore()memberStore.setProfile(result.data)uni.navigateTo({url:'/pages/main/main',})}else{uni.showToast({icon: 'error',title: result.msg})faceRecognition()}}},fail: (err) => {uni.showToast({icon: 'error',title: '上传失败fail!'})}});}
</script>

遇到的问题

  1. 使用nvue页进行开发

vue页面在调用live-pusher组件的API时,不支持回调
人脸拍摄需要在摄像头调起成功之后进行,并且拍摄快照需要在success回调中获取值

  1. 创建 live-pusher 上下文 livePusherContext 对象时要用proxy代理对象

之前使用 getCurrentInstance().ctx 去获取实例对象,在本地打包以及自定义基座包的时候都没有问题,但是打正式包就会报错,导致无法 创建 live-pusher对象,摄像头黑屏

ctx 和 proxy 的区别

特性ctxproxy
适用版本Vue 2.x 和 Vue 3.xVue 3.x
推荐使用Vue 2.xVue 3.x
访问方式直接访问组件实例通过代理对象访问组件实例
安全性较低,直接操作实例可能带来风险较高,通过代理对象更安全
  1. 流文件上传

刚开始尝试用uni.request尝试上传流文件,没成功 。在这个做个记录
uni实现本地文件转数据流

  • 通过h5+的API FileReader读取文件 获得base64地址
    • uni中不支持js的FileReader 只支持5+的 API,两者是有区别的,需要注意下
  • uni自带的API base64ToArrayBuffer 再将base64转换为buffer
pusherContext.value.snapshot({success: (res: UniHelper.LivePusherProps) => {// 5+API FileReader读取文件 获得base64地址const reader = new plus!.io!.FileReader!();reader.readAsDataURL(res.message.tempImagePath)reader.onload = (readerRes: PlusIoFileEvent) => {var speech = readerRes!.target!.result;imgUrl.value = speech// uni自带的APIbase64ToArrayBuffer 将文件转换为bufferconst arrayBuffer = uni.base64ToArrayBuffer(speech)const resFace = await faceRecognitionAPI(arrayBuffer)if(resFace.code == 200){isfaced.value = truesetTimeout(() => {uni.navigateTo({url: '/pages/main/main'})}, 1500)}else{uni.showToast({icon: 'error',title: '识别失败,请对准摄像头!'})faceRecognition()}}}
})

相关文章:

uniapp实现人脸识别(不使用三方插件)

uniapp实现人脸识别 内容简介功能实现上传身份证进行人脸比对 遇到的问题 内容简介 1.拍摄/相册将身份证照片上传到接口进行图片解析 2.使用live-pusher组件拍摄人脸照片&#xff0c;上传接口与身份证人脸进行比对 功能实现 上传身份证 先看下效果 点击按钮调用chooseImage…...

2025全新JSP简约博客平台-免费开源

前言 最近收到不少同学期末作业的需求&#xff0c;都还是JSP的老技术&#xff0c;介于现在很多网上可以找到的JSP现有项目&#xff0c;要么就是很老好几年前的&#xff0c;要么就是搞了一通不仅乱码还各自报错失败的&#xff0c;总之就是资源有限&#xff0c;于是我花了一星期…...

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…...

基于SpringBoot的“4S店车辆管理系统”的设计与实现(源码+数据库+文档+PPT)_2025-02-10

基于SpringBoot的“4S店车辆管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统登录界面图 管理员功能界…...

ESP-IDF学习记录(6)

这篇不知道起什么标题&#xff0c;因为已经卡滞很久了&#xff0c;从年前到现在&#xff0c;但也没停止探索 1.烧录 用的小型加热台&#xff0c;这步对我来说最难&#xff0c;自己没有焊接过QFN32的封装 总结一下目前遇到的问题&#xff1a; 1&#xff09;5V供电选成了12V转…...

Day84:数据可视化

数据可视化是数据分析的重要组成部分,它能直观地展现数据规律,使复杂数据变得易懂。Python 提供了多个数据可视化库,其中最常用的是 Matplotlib 和 Seaborn。今天,我们将学习如何使用这些工具绘制折线图、柱状图、散点图等。 1. 安装和导入库 如果你的 Python 没有安装 Ma…...

【机器学习与数据挖掘实战】案例13:基于BP神经网络模型的家用热水器用户行为分析与事件识别

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支&#xff0c;专注于让计算机系统通过数据学习和改进。它利用统计和计算方法&#xff0c;使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...

数据结构 动态顺序表-vector

一、创建vector #include <vector> // 头⽂件 using namespace std; const int N 20; struct node {int a, b, c; }; // 1. 创建 void init() {vector<int> a1; // 创建⼀个空的可变⻓数组 vector<int> a2(N); // 指定好了⼀个空间&#xff0c;⼤⼩为 N …...

Windows 植物大战僵尸杂交版

植物大战僵尸杂交版 链接&#xff1a;https://pan.xunlei.com/s/VOIjttp8EzfL9fXO6S6ekvZYA1?pwdw8cm# 作者: B站UP主 潜艇伟伟迷...

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…...

SpringBoot和Spring主要区别

SpringBoot和Spring主要区别 1. 核心定位2. 配置方式3. 依赖管理4. 内嵌服务器5. 开发效率6. 监控与管理7. 适用场景8. 总结 Spring Boot 和 Spring 是 Java 生态中密切相关的两个框架&#xff0c;但它们的定位和使用场景有明显区别。以下是主要区别&#xff1a; 1. 核心定位 S…...

Blazor-<select>

今天我们来说说<select>标签的用法&#xff0c;我们还是从一个示例代码开始 page "/demoPage" rendermode InteractiveAuto inject ILogger<InjectPage> logger; <h3>demoPage</h3> <select multiple>foreach (var item in list){<…...

力扣-数组-20 有效的括号

思路 有效的括号符合栈的思想&#xff0c;先进后出 代码 class Solution { public:bool isValid(string s) {stack <char> sign;sign.push(s[0]);for(int i 1; i < s.size(); i){if(s[i] { || s[i] [ || s[i] (){sign.push(s[i]);}else if(s[i] } && …...

Best practice-ThreadLocal高并发场景的最佳实践

关于ThreadLocal基础信息 引用一段来自ThreadLocal源码中的doc注释来说明其特性&#xff1a; This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has …...

WiFi配网流程—SmartConfig 配网流程

目录 &#x1f4cc; SmartConfig 配网流程 &#x1f449; 阶段 1&#xff1a;设备进入配网模式 &#x1f449; 阶段 2&#xff1a;手机 App 发送 Wi-Fi 配置信息 &#x1f449; 阶段 3&#xff1a;设备解析 Wi-Fi 配置&#xff0c;连接家庭网络 &#x1f449; 阶段 4&…...

【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-GSYVideoPlayer

简介 GSYVideoPlayer是一个视频播放器库&#xff0c;支持切换内核播放器&#xff08;IJKPlayer、avplayer&#xff09;&#xff0c;并且支持视频截图能力、 视频生成gif能力、边播边缓存能力、视频全屏能力等多种能力。 效果展示&#xff1a; 下载安装 ohpm install ohos/gs…...

IDEA中常见问题汇总

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现

代码下载&#xff1a;私信博主回复基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现 《基于蜘蛛蜂优化算法的无人机集群三维路径规划》 摘要 本研究针对无人机集群三维路径规划问题&#xff0c;提出了一种基于蜘蛛蜂优化算法的解决方案。以5个无人机构成的集群为研究对…...

React中使用​​useReducer​​​高阶钩子来管理状态

在React开发中&#xff0c;状态管理是一个重要的概念。useState钩子用于管理简单的局部状态&#xff0c;但对于复杂的状态逻辑&#xff0c;useReducer钩子提供了更强大和灵活的解决方案。本文将详细介绍如何在React中使用 useReducer高阶钩子来管理状态。 一、useReducer概述 …...

一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路

以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

聚类算法概念、分类、特点及应用场景【机器学习】【无监督学习】

概念 机器学习聚类算法‌是一种无监督学习方法&#xff0c;旨在将数据集分割成不同的类或簇&#xff0c;使得同一簇内的数据对象相似性尽可能大&#xff0c;而不同簇之间的数据对象差异性也尽可能大。聚类算法广泛应用于新闻自动分组、用户分群、图像分割等领域。‌ 主要聚类算…...

Oracle数据连接 Dblink

拓展&#xff1a; oracle远程登陆数据库 1.oracle客户端或者服务端 2.修改你的电脑如下路径文件&#xff08;服务器IP,服务器的数据库名&#xff0c;服务器的数据库端口号&#xff09; c:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora orcl_109 (DESCRIPTION …...

Deepseek系列从v3到R易背面经版

deepseek v3 base要点 MTP : Multi-Token Prediction 训练时&#xff1a; 1. 把前一个block中input tokens经过embedding layer和transformer block的输出&#xff0c;进入output head之前的内容记为h&#xff0c;与下一个block的input tokens经过embedding layer输出的内容都…...

Maven入门核心知识点总结

Maven 1. POM&#xff08;Project Object Model&#xff09;2. 坐标&#xff08;Coordinates&#xff09;3. 依赖管理&#xff08;Dependency Management&#xff09;4. 常用五个生命周期&#xff08;Life Circle&#xff09;5. Maven 仓库&#xff08;Maven Repository&#x…...

Blocked aria-hidden on an element because its descendant retained focus.

在使用el-popover和el-radio-group实现弹窗选择数据后调用el-popover的doClose()方法时一直报错&#xff01; 经过分析发现el-popover及el-radio__original有aria-hidden属性&#xff0c;具体aria-hidden属性应用自行搜索了解。既然是这个玩意引起的&#xff0c;则在显示时将a…...

JavaScript 基础语法:变量、数据类型、运算符、条件语句、循环

JavaScript 是一种动态类型的脚本语言&#xff0c;广泛用于前端开发。以下是 JavaScript 基础语法的核心内容&#xff0c;包括变量、数据类型、运算符、条件语句和循环。 --- ### 1. 变量 变量用于存储数据。JavaScript 中有三种声明变量的方式&#xff1a; - **var**&…...

ElementUI的常用组件及使用技巧

1. 引言 项目背景与目标 随着前端技术的快速发展,构建高效、美观的用户界面变得越来越重要。ElementUI作为一款基于Vue.js的组件库,提供了丰富的组件和工具,帮助开发者快速构建高质量的Web应用。本文旨在介绍ElementUI的常用组件及其使用技巧,帮助开发者更好地利用Elemen…...

python爬虫--简单登录

1&#xff0c;使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…...

三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信

三次握手&#xff1a; 第一次握手&#xff1a;客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态​ 第二次握手&#xff1a;服务器向客户端回传一条ACK应答数据x1, 同时发送一条SYN待确认数据y&#xff0c;服务器进入SYN_RECV状态​ 第三次握手&#xff1a;客户端向服…...

Linux TCP 编程详解与实例

一、引言 在网络编程的领域中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下&#xff0c;使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…...