vue使用trackingjs
- 前言:因为公司是做人工智能-AI的,所有一个web数据平台为了装X,需要做个人脸登陆。前台需要把人脸的base64发给后台去做人脸校验。
功能很简单,需要注意的是web需要实现“调用摄像头”和“自动拍照”。于是开始找资料,在github上找到个8363星的trackingjs,不得
不说js如此强大。可是当我在最后发现trackingjs没有关闭摄像头,于是在网上也找了一些例子都没有成功关闭。被迫不得不去看tracking
的源码。最后把代码发出来,给后人参考。 - 下载
官网地址:https://trackingjs.com/。我的网盘下载,提取码:nuex。我这里直接下载压缩包到本地。解压后我们需要下面这两个文件
tracking.js/build/tracking-min.js,
tracking.js/build/data/face-min.js - 引入vue项目使用
// 引入trackingjs所需文件 import tracking from '@/assets/js/tracking-min.js' import '@/assets/js/face-min.js' export default { name: 'login', data() { return { trackerTask: null, trackering: null, mediaStreamTrack: null } }, mounted() { this.getCompetence() }, methods: { getCompetence() { let flag = true; const _this = this; const video = this.mediaStreamTrack = document.getElementById('videoCamera-face'); const canvas = document.getElementById('canvas-face'); const context = canvas.getContext('2d'); const tracker = new window.tracking.ObjectTracker('face'); tracker.setInitialScale(4); tracker.setStepSize(2); tracker.setEdgesDensity(0.1); // 启动摄像头初始化 this.trackerTask = window.tracking.track('#videoCamera-face', tracker, { camera: true }); tracker.on('track', function(event) { context.clearRect(0, 0, canvas.width, canvas.height); event.data.forEach(function(rect) { context.strokeStyle = '#ff0000'; context.strokeRect(rect.x, rect.y, rect.width, rect.height); }); if (event.data.length) { // 会不停的去检测人脸,所以这里需要做个锁 if (flag) { // 裁剪出人脸并绘制下来 const canvasUpload = document.getElementById('canvas-face-upload') const contextUpload = canvasUpload.getContext('2d') contextUpload.drawImage(video, 0, 0, 105, 105) flag = false // 人脸的basa64 const dataURL = canvasUpload.toDataURL('image/jpeg'); // ajax请求 _this.$store.dispatch('LoginByFaceID', { face_img: dataURL.slice(23) // 我们后台需要的basa64不要前缀 }).then(res => { let type = 'success' // 登录成功跳转到首页 if (res.data.code === 200) { _this.$router.push({ path: '/' }); } // 登录失败重新进行人脸检测 else { type = 'error' setTimeout(() => { flag = true }, 1500) } _this.$message({ message: res.data.message, type, center: true }); }).catch(error => { console.log(error) }) } } }); } }, destroyed() {
if(!this.mediaStreamTrack){
return
} // 关闭摄像头和侦测 this.mediaStreamTrack.srcObject.getTracks()[0].stop(); this.trackerTask.stop() } }