最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue2+tracking實(shí)現(xiàn)PC端的人臉識(shí)別示例

 更新時(shí)間:2022年05月20日 10:13:16   作者:名字被你們想完了  
本文主要介紹了vue2+tracking實(shí)現(xiàn)PC端的人臉識(shí)別示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

總是會(huì)有一些奇奇怪怪的需求無(wú)法避免。記錄一下曾經(jīng)項(xiàng)目遇到的一個(gè)需求。

需求

上傳患者真實(shí)頭像,可以有兩種選擇,一種是通過(guò)常規(guī)的文件選擇方式上傳,第二種方式就是醫(yī)生可以調(diào)用電腦的攝像頭拍一張然后上傳。

分析

常規(guī)的就不用分析了,只分析第二種:

  • 調(diào)用本地?cái)z像頭
  • 然后可以進(jìn)行拍照
  • 因?yàn)槭腔颊叩恼鎸?shí)頭像,方便辨認(rèn),要求要拍到患者臉部
  • 檢測(cè)到患者臉部,自動(dòng)截圖,醫(yī)生只需要點(diǎn)擊上傳即可

實(shí)現(xiàn)思路

首先看有不有能識(shí)別到患者臉部的前端第三方庫(kù),如果沒(méi)有,這個(gè)需求就相對(duì)來(lái)說(shuō)就麻煩一點(diǎn),就是在拍照的時(shí)候需要醫(yī)生辨別能否達(dá)到上傳的要求,然后再拍照上傳也行。

基于上面的思路,開(kāi)始尋找,最后確定使用 tracking.js 它的 github 地址

使用 tracking.js

  • 安裝:yarn add tracking
  • 使用,用一個(gè)測(cè)試 demo 來(lái)展示:

src/components/TestFace.vue

<template>
  <div>
    <div>
      <p>請(qǐng)將攝像頭對(duì)準(zhǔn)患者臉部</p>
      <video id="video" style="transform:rotateY(180deg)" autoplay></video>
    </div>
    <div>
      <p>檢測(cè)人臉結(jié)果</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 () {
      // 有可能觸發(fā)一些其他的按鈕會(huì)重新獲取
      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') // 檢測(cè)人臉
        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) {
            // 說(shuō)明檢測(cè)到人臉了,此時(shí)就可以截取圖片傳遞給后端
            // canvas 調(diào)用 toDataURL
          }
        })
      })
    },

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

    // 成功顯示
    success (stream) {
      this.videoObj.srcObject = stream
      this.videoObj.play()
    },
    // 失敗拋出錯(cuò)誤,可能用戶(hù)電腦沒(méi)有攝像頭,或者攝像頭權(quán)限沒(méi)有打開(kāi)
    error (error) {
      // 可以在這里面提示用戶(hù)
      console.log(`訪(fǎng)問(wèn)用戶(hù)媒體設(shè)備失敗${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)
}

最終的效果如下:

最后

首先確保有攝像頭

有時(shí)候本地調(diào)試無(wú)法打開(kāi)攝像頭,可以在瀏覽器上輸入:chrome://flags/#unsafely-treat-insecure-origin-as-secure

然后會(huì)出現(xiàn)如下頁(yè)面,再操作即可:

到此這篇關(guān)于vue2+tracking實(shí)現(xiàn)PC端的人臉識(shí)別示例的文章就介紹到這了,更多相關(guān)vue2 tracking PC端的人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue實(shí)現(xiàn)驗(yàn)證碼功能

    Vue實(shí)現(xiàn)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • vue 實(shí)現(xiàn)用戶(hù)登錄方式的切換功能

    vue 實(shí)現(xiàn)用戶(hù)登錄方式的切換功能

    這篇文章主要介紹了vue 實(shí)現(xiàn)用戶(hù)登錄方式的切換功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • vue在使用element組件出現(xiàn)<el-input>標(biāo)簽無(wú)法輸入的問(wèn)題

    vue在使用element組件出現(xiàn)<el-input>標(biāo)簽無(wú)法輸入的問(wèn)題

    這篇文章主要介紹了vue在使用element組件出現(xiàn)<el-input>標(biāo)簽無(wú)法輸入的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue+element 解決瀏覽器自動(dòng)填充記住的賬號(hào)密碼問(wèn)題

    Vue+element 解決瀏覽器自動(dòng)填充記住的賬號(hào)密碼問(wèn)題

    我們?cè)谧鰂orm表單的時(shí)候,會(huì)發(fā)現(xiàn),瀏覽器會(huì)自動(dòng)的將我們之前保存的密碼,自動(dòng)的填充到表單中input 為 type="password" 的框中,如何實(shí)現(xiàn)此功能呢,下面小編給大家介紹下,感興趣的朋友一起看看吧
    2019-06-06
  • vue使用elementui的el-menu的折疊菜單collapse示例詳解

    vue使用elementui的el-menu的折疊菜單collapse示例詳解

    這篇文章主要介紹了vue使用elementui的el-menu的折疊菜單collapse示例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • vue項(xiàng)目中監(jiān)聽(tīng)手機(jī)物理返回鍵的實(shí)現(xiàn)

    vue項(xiàng)目中監(jiān)聽(tīng)手機(jī)物理返回鍵的實(shí)現(xiàn)

    這篇文章主要介紹了vue項(xiàng)目中監(jiān)聽(tīng)手機(jī)物理返回鍵的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • vue中v-text / v-html使用實(shí)例代碼詳解

    vue中v-text / v-html使用實(shí)例代碼詳解

    這篇文章主要介紹了vue中v-text / v-html使用實(shí)例代碼詳解,非常不錯(cuò),代碼簡(jiǎn)單易懂,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Vue Axios異步與數(shù)據(jù)類(lèi)型轉(zhuǎn)換問(wèn)題淺析

    Vue Axios異步與數(shù)據(jù)類(lèi)型轉(zhuǎn)換問(wèn)題淺析

    總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路,Axios是一個(gè)開(kāi)源的可以用在瀏覽器端和Node JS的異步通信框架,主要作用就是實(shí)現(xiàn)AJAX異步通信
    2023-01-01
  • vue模版編譯詳情

    vue模版編譯詳情

    本文的初衷是想讓更多哎學(xué)習(xí)的人知道并了解vue模版編譯,所以文中主要以階段流程為主,不會(huì)涉及過(guò)多的底層代碼邏輯,需要的朋友可以參考一下
    2021-09-09
  • Vue3實(shí)現(xiàn)Element Plus表格的多選功能與條件操作

    Vue3實(shí)現(xiàn)Element Plus表格的多選功能與條件操作

    Element-plus是ElementUI的升級(jí)版,是一套基于vue2與vue3的桌面端組件庫(kù),它提供了豐富的組件幫助開(kāi)發(fā)人員快速構(gòu)建功能強(qiáng)大、風(fēng)格統(tǒng)一的頁(yè)面,本文給大家介紹了Vue3實(shí)現(xiàn)Element Plus表格的多選功能與條件操作,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

宁夏| 光山县| 天柱县| 伊川县| 中宁县| 苗栗市| 昌乐县| 兴海县| 江川县| 龙陵县| 年辖:市辖区| 东城区| 香港| 兴安盟| 南安市| 襄城县| 吉安县| 行唐县| 固安县| 周至县| 沁阳市| 乌拉特中旗| 巴彦淖尔市| 乌兰浩特市| 柞水县| 驻马店市| 涞水县| 普兰县| 凤阳县| 九龙城区| 宝坻区| 沂水县| 嘉义县| 金湖县| 青海省| 大渡口区| 乌兰浩特市| 合山市| 家居| 南安市| 营山县|