vue2+tracking实现PC端的人脸识别示例

 更新时间:2022年05月20日 10:13:16   作者:名字被你们想完了  
本文主要介绍了vue2+tracking实现PC端的人脸识别示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

总是会有一些奇奇怪怪的需求无法避免。记录一下曾经项目遇到的一个需求。

需求

上传患者真实头像,可以有两种选择,一种是通过常规的文件选择方式上传,第二种方式就是医生可以调用电脑的摄像头拍一张然后上传。

分析

常规的就不用分析了,只分析第二种:

  • 调用本地摄像头
  • 然后可以进行拍照
  • 因为是患者的真实头像,方便辨认,要求要拍到患者脸部
  • 检测到患者脸部,自动截图,医生只需要点击上传即可

实现思路

首先看有不有能识别到患者脸部的前端第三方库,如果没有,这个需求就相对来说就麻烦一点,就是在拍照的时候需要医生辨别能否达到上传的要求,然后再拍照上传也行。

基于上面的思路,开始寻找,最后确定使用 tracking.js 它的 github 地址

使用 tracking.js

  • 安装:yarn add tracking
  • 使用,用一个测试 demo 来展示:

src/components/TestFace.vue

<template>
  <div>
    <div>
      <p>请将摄像头对准患者脸部</p>
      <video id="video" style="transform:rotateY(180deg)" autoplay></video>
    </div>
    <div>
      <p>检测人脸结果</p>
      <canvas id="canvas" width="200" height="200" style="transform:rotateY(180deg)"></canvas>
    </div>
  </div>
</template>

<script>
import { userMedia } from '../utils/utils'
require('tracking/build/tracking-min.js')
require('tracking/build/data/face-min.js')

export default {
  data () {
    return {
      videoObj: null,
      trackerTask: null
    }
  },

  mounted () {
    this.openCamera()
  },

  methods: {
    openCamera () {
      // 有可能触发一些其他的按钮会重新获取
      this.$nextTick(() => {
        const canvas = document.getElementById('canvas')
        const context = canvas.getContext('2d')
        this.videoObj = document.getElementById('video')
        // eslint-disable-next-line no-undef
        const tracker = new tracking.ObjectTracker('face') // 检测人脸
        tracker.setInitialScale(4)
        tracker.setStepSize(2)
        tracker.setEdgesDensity(0.1)

        // eslint-disable-next-line no-undef
        this.trackerTask = tracking.track('#video', tracker, { camera: true })

        const constraints = {
          video: { width: 200, height: 200 },
          audio: false
        }

        userMedia(constraints, this.success, this.error)

        tracker.on('track', (event) => {
          event.data.forEach((rect) => {
            // 绘制到 canvas
            context.drawImage(this.videoObj, 0, 0, canvas.width, canvas.height)
            context.font = '16px Helvetica'
            context.strokeStyle = '#1890ff'
            context.strokeRect(rect.x, rect.y, rect.width, rect.height)
          })

          if (event.data.length !== 0) {
            // 说明检测到人脸了,此时就可以截取图片传递给后端
            // canvas 调用 toDataURL
          }
        })
      })
    },

    handleCancel () {
      this.videoObj.srcObject.getTracks()[0].stop()
      this.trackerTask.stop()
    },

    // 成功显示
    success (stream) {
      this.videoObj.srcObject = stream
      this.videoObj.play()
    },
    // 失败抛出错误,可能用户电脑没有摄像头,或者摄像头权限没有打开
    error (error) {
      // 可以在这里面提示用户
      console.log(`访问用户媒体设备失败${error.name}, ${error.message}`)
    }
  },
  beforeDestroy () {
    this.handleCancel()
  }
}
</script>

src/utils/utils.js

export let userMedia = function (constraints, success, error) {
  if (navigator.mediaDevices.getUserMedia) {
    userMedia = function (constraints, success, error) {
      navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error)
    }
  } else if (navigator.webkitGetUserMedia) {
    userMedia = function (constraints, success, error) {
      navigator.webkitGetUserMedia(constraints, success, error)
    }
  } else if (navigator.mozGetUserMedia) {
    userMedia = function (constraints, success, error) {
      navigator.mozGetUserMedia(constraints, success, error)
    }
  } else if (navigator.getUserMedia) {
    userMedia = function (constraints, success, error) {
      navigator.getUserMedia(constraints, success, error)
    }
  }

  userMedia(constraints, success, error)
}

最终的效果如下:

最后

首先确保有摄像头

有时候本地调试无法打开摄像头,可以在浏览器上输入:chrome://flags/#unsafely-treat-insecure-origin-as-secure

然后会出现如下页面,再操作即可:

到此这篇关于vue2+tracking实现PC端的人脸识别示例的文章就介绍到这了,更多相关vue2 tracking PC端的人脸识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3 Element-plus el-menu无限级菜单组件封装过程

    Vue3 Element-plus el-menu无限级菜单组件封装过程

    对于element中提供给我们的el-menu组件最多可以实现三层嵌套,如果多一层数据只能自己通过变量去加一层,如果加了两层、三层这种往往是行不通的,所以只能进行封装,这篇文章主要介绍了Vue3 Element-plus el-menu无限级菜单组件封装,需要的朋友可以参考下
    2023-04-04
  • vue将毫秒数转化为正常日期格式的实例

    vue将毫秒数转化为正常日期格式的实例

    今天小编就为大家分享一篇vue将毫秒数转化为正常日期格式的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue启动报错‘vue-cli-service serve‘问题及解决

    vue启动报错‘vue-cli-service serve‘问题及解决

    这篇文章主要介绍了vue启动报错‘vue-cli-service serve‘问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue2/3 登录后用户无操作半小时后自动清除登录信息退出登录下线(示例代码)

    Vue2/3 登录后用户无操作半小时后自动清除登录信息退出登录下线(示例代码)

    这篇文章主要介绍了Vue2/3 登录后用户无操作半小时后自动清除登录信息退出登录下线,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 深入理解Vue的过度与动画

    深入理解Vue的过度与动画

    这篇文章主要为大家介绍了Vue的过度与动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 详解vue如何使用rules对表单字段进行校验

    详解vue如何使用rules对表单字段进行校验

    这篇文章主要介绍了详解vue如何使用rules对表单字段进行校验,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • VUE 实现复制内容到剪贴板的两种方法

    VUE 实现复制内容到剪贴板的两种方法

    这篇文章主要介绍了VUE 实现复制内容到剪贴板功能,本文通过两种方法,给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-04-04
  • Vue3如何在setup中获取元素引用(ref)

    Vue3如何在setup中获取元素引用(ref)

    这篇文章主要介绍了Vue3如何在setup中获取元素引用(ref)问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Element中Slider滑块的具体使用

    Element中Slider滑块的具体使用

    这篇文章主要介绍了Element中Slider滑块的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • vue--vuex详解

    vue--vuex详解

    这篇文章主要介绍了vue--vuex的详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论