vue+JavaScript利用tracker.js开发一个人脸自动识别

项目需要用到用户通过人脸上传到后台存储来完成一些特殊操作

思考 既然需要实时捕获  那么就需要用到video和canvas配合来做实时捕获和截取图片使用  配合上tracking.js的识别功能 分出以下几个模块

项目是基于vue 首先需要引入四个用到的模块  注:如果你的请求不是JQUERY  请无视 这是我拿来做测试用

 

 

 

写上几个我们需要用到的标签模块 分别为video canvas 和做预览用的img标签

 

 

代码:

 

<template>
  <div>
    <div class="trackTitle">
      <h3>{{ trackTitle }}</h3>
    </div>
    <div class="trackFaceBox">
      <!-- 摄像头 -->
      <div class="videoBox">
        <video autoplay playsinline ref="video" id="video"></video>
      </div>
      <!-- canvas摄像头实时预览 -->
      <canvas id="canvas" width="350" height="400"></canvas>
    </div>
    <!-- 预览图片 -->
    <img :src="photo" />
  </div>
</template>

  

 

主要模块和标签都写好了之后 思考一下 首先肯定需要在页面渲染完成之后开启摄像头和实时获取canvas内容   写一个初始化方法:

 

 

代码:

// 开启摄像头识别
    openCamera() {
      this.video = document.getElementById("video");
      const canvas = document.getElementById("canvas");
      const context = canvas.getContext("2d");

      const tracker = new window.tracking.ObjectTracker("face");
      tracker.setStepSize(1);
      // 识别率
      tracker.setEdgesDensity(0.08);
      tracker.setInitialScale(5);
      this.trackerTask = window.tracking.track("#video", tracker, {
        camera: true,
      });
      tracker.on("track", (event) => {
        context.clearRect(0, 0, canvas.width, canvas.height);
        let text = "请将人脸置放在识别处";
        let ret = {};
        const that = this;
        event.data.forEach(function (rect) {
          if (rect.x > 0) {
            that.saveImage();
            return (text = "已识别到人脸,请点击拍照"), (ret = rect);
          }
          // context.strokeStyle = "red";
          // context.strokeRect(rect.x, rect.y, rect.width, rect.height);
        });
        this.ret = ret;
        this.trackTitle = text;
      });
    },

在tracker.on识别的时候 会有一个循环体 如果找到人脸之后 我们要结束这个循环 不要让循环体继续 对应代码

 

 

 当这个的rect.x 也就是对应着出现识别框的时候 他的x轴是不为空的 所以他对应的会存在识别完成

之后再进行return 就结束识别了 但不是真的结束识别了 只是我们结束了这次识别的照片

之后 识别完成 就进行图片截取 如下:

 

 

 代码:

 

 // 获取到人脸后拍照保存到maryimgae
    saveImage() {
      let canvas = document.getElementById("canvas");
      let ctx = canvas.getContext("2d");
      console.log(this.video);
      canvas.width = this.ret.width;
      canvas.height = this.ret.height;
      ctx.drawImage(
        this.video,
        this.ret.x,
        this.ret.y,
        this.ret.width + 100,
        this.ret.height + 200,
        0,
        0,
        this.ret.width,
        this.ret.height
      );
      // 获取图片base64链接
      var image = canvas.toDataURL("image/jpg");
      canvas.toBlob(async (blob) => {
        console.log(blob);
        // alert(JSON.stringify(blob));
        // alert(URL.createObjectURL(blob));
        // 此处写上传到后台的接口即可
      });
      this.photo = image;
    },

  这样就完成了识别人脸到图片截取的整个过程 下面放手机预览图

 

posted @ 2021-01-02 23:12  Lastly  阅读(1354)  评论(0编辑  收藏  举报