当前位置: 首页 > 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 = 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.kler.cn/a/536908.html

相关文章:

  • 【服务器知识】如何在linux系统上搭建一个nfs
  • 深度学习 Pytorch 神经网络的学习
  • 解决使用python提取word文档中所有的图片时图片丢失的问题
  • 批量提取word表格数据到一个excel
  • 【React】受控组件和非受控组件
  • tolua[一]框架搭建,运行example
  • ISP代理与住宅代理的区别
  • MySQL——数据库的操作
  • 【重新认识C语言----文件管理篇】
  • 【面试场景】MySQL分布式主键选取
  • C++,设计模式,【单例模式】
  • NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理 + ids4鉴权
  • 学习率调整策略 | PyTorch 深度学习实战
  • IntelliJ IDEA新版本的底部version control(或git)里local change窗口显示配置修改详细教程
  • PHP填表统计预约打卡表单系统小程序
  • 配置GitHub和PicGo的详细步骤
  • 通过Python编写的中国象棋小游戏
  • mac 安装 dotnet 环境
  • 嵌入式硬件篇---OpenMV串口通信json字符串
  • Redis | 十大数据类型
  • Spring Boot:解决现代Java应用开发的难题
  • 关于阿里云 dataworks 运维中心下的任务运维的问题
  • 发布:大彩科技DN系列2.8寸高性价比串口屏发布!
  • TPC服务器与客户端的搭建
  • 【iOS自动化】Xcode配置WebDriverAgent
  • Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用