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端的人脸识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue实现验证码功能

    Vue实现验证码功能

    这篇文章主要为大家详细介绍了Vue实现验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • vue 实现用户登录方式的切换功能

    vue 实现用户登录方式的切换功能

    这篇文章主要介绍了vue 实现用户登录方式的切换功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • vue在使用element组件出现<el-input>标签无法输入的问题

    vue在使用element组件出现<el-input>标签无法输入的问题

    这篇文章主要介绍了vue在使用element组件出现<el-input>标签无法输入的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Vue+element 解决浏览器自动填充记住的账号密码问题

    Vue+element 解决浏览器自动填充记住的账号密码问题

    我们在做form表单的时候,会发现,浏览器会自动的将我们之前保存的密码,自动的填充到表单中input 为 type="password" 的框中,如何实现此功能呢,下面小编给大家介绍下,感兴趣的朋友一起看看吧
    2019-06-06
  • vue使用elementui的el-menu的折叠菜单collapse示例详解

    vue使用elementui的el-menu的折叠菜单collapse示例详解

    这篇文章主要介绍了vue使用elementui的el-menu的折叠菜单collapse示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • vue项目中监听手机物理返回键的实现

    vue项目中监听手机物理返回键的实现

    这篇文章主要介绍了vue项目中监听手机物理返回键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • vue中v-text / v-html使用实例代码详解

    vue中v-text / v-html使用实例代码详解

    这篇文章主要介绍了vue中v-text / v-html使用实例代码详解,非常不错,代码简单易懂,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Vue Axios异步与数据类型转换问题浅析

    Vue Axios异步与数据类型转换问题浅析

    总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路,Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架,主要作用就是实现AJAX异步通信
    2023-01-01
  • vue模版编译详情

    vue模版编译详情

    本文的初衷是想让更多哎学习的人知道并了解vue模版编译,所以文中主要以阶段流程为主,不会涉及过多的底层代码逻辑,需要的朋友可以参考一下
    2021-09-09
  • Vue3实现Element Plus表格的多选功能与条件操作

    Vue3实现Element Plus表格的多选功能与条件操作

    Element-plus是ElementUI的升级版,是一套基于vue2与vue3的桌面端组件库,它提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面,本文给大家介绍了Vue3实现Element Plus表格的多选功能与条件操作,需要的朋友可以参考下
    2024-08-08

最新评论