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

news2025/3/20 20:12:49

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 = true
   uni.uploadFile({
       url: '/cardInfo/uploads', // 你的上传接口地址
       filePath: stream,         // 选中的图片
       name: 'file',             // 与后端协定的key
       success: ({data, statusCode }) => {
           if(statusCode == 200){
           	 // 这里需要注意下,接口返回的事string,需要解析后才可正常使用
             const result = JSON.parse(data)
             if(result.code == 200 || result.success == true){
				// 这里写上传成功的逻辑
				// 我要将数据存在store中 给后面的页面使用
				loading.value = false
                const 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 将文件转换为buffer
     			 const arrayBuffer = uni.base64ToArrayBuffer(speech)
     			 const resFace = await faceRecognitionAPI(arrayBuffer)
				 if(resFace.code == 200){
                    isfaced.value = true
                    setTimeout(() => {
                       uni.navigateTo({
                         url: '/pages/main/main'
                       })
                   }, 1500)
                 }else{
                   uni.showToast({
                      icon: 'error',
                       title: '识别失败,请对准摄像头!'
                   })
                     faceRecognition()
                   }
		}
	}
})

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

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

相关文章

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转…

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

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

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 使用广播信…

Blazor-<select>

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

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 …

【鸿蒙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个无人机构成的集群为研究对…

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…

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 编程的各个方面&…

Elasticsearch 开放推理 API 增加了 Azure AI Studio 支持

作者&#xff1a;来自 Elastic Mark Hoy Elasticsearch 开放推理 API 现已支持 Azure AI Studio。在此博客中了解如何将 Azure AI Studio 功能与 Elasticsearch 结合使用。 作为我们持续致力于为 Microsoft Azure 开发人员提供他们选择的工具的一部分&#xff0c;我们很高兴地宣…

提示工程:少样本提示(Few-shot Prompting)

少样本提示&#xff08;Few-shot Prompting&#xff09;是一种利用大语言模型从少量示例样本中学习并处理任务的方法。它的核心思想是利用大语言模型的上下文学习能力&#xff0c;通过在提示中增加“示例样本”来启发大语言模型达到举一反三的效果。这种方法避免了重新训练或者…