vue2+tracking實現(xiàn)PC端的人臉識別示例
總是會有一些奇奇怪怪的需求無法避免。記錄一下曾經(jīng)項目遇到的一個需求。
需求
上傳患者真實頭像,可以有兩種選擇,一種是通過常規(guī)的文件選擇方式上傳,第二種方式就是醫(yī)生可以調(diào)用電腦的攝像頭拍一張然后上傳。
分析
常規(guī)的就不用分析了,只分析第二種:
- 調(diào)用本地攝像頭
- 然后可以進行拍照
- 因為是患者的真實頭像,方便辨認,要求要拍到患者臉部
- 檢測到患者臉部,自動截圖,醫(yī)生只需要點擊上傳即可
實現(xiàn)思路
首先看有不有能識別到患者臉部的前端第三方庫,如果沒有,這個需求就相對來說就麻煩一點,就是在拍照的時候需要醫(yī)生辨別能否達到上傳的要求,然后再拍照上傳也行。
基于上面的思路,開始尋找,最后確定使用 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>檢測人臉結(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ā)一些其他的按鈕會重新獲取 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 調(diào)用 toDataURL } }) }) }, handleCancel () { this.videoObj.srcObject.getTracks()[0].stop() this.trackerTask.stop() }, // 成功顯示 success (stream) { this.videoObj.srcObject = stream this.videoObj.play() }, // 失敗拋出錯誤,可能用戶電腦沒有攝像頭,或者攝像頭權(quán)限沒有打開 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) }
最終的效果如下:
最后
首先確保有攝像頭
有時候本地調(diào)試無法打開攝像頭,可以在瀏覽器上輸入:chrome://flags/#unsafely-treat-insecure-origin-as-secure
然后會出現(xiàn)如下頁面,再操作即可:
到此這篇關(guān)于vue2+tracking實現(xiàn)PC端的人臉識別示例的文章就介紹到這了,更多相關(guān)vue2 tracking PC端的人臉識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決element-ui?el-drawer抽屜el-dialog彈框關(guān)閉優(yōu)化demo
這篇文章主要為大家介紹了解決element-ui?el-drawer抽屜el-dialog彈框關(guān)閉優(yōu)化demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-06-06vue中v-for通過動態(tài)綁定class實現(xiàn)觸發(fā)效果
這篇文章主要介紹了vue中v-for通過動態(tài)綁定class實現(xiàn)觸發(fā)效果,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-12-12