前台vue+后台java实现离线人脸检测采集识别tracking.js

1、前台页面


```html
 <script th:src="@{/plugin/face/tracking-min.js}" th:inline="javascript"></script>
    <script th:src="@{/plugin/face/face-min.js}" th:inline="javascript"></script>
    <script th:src="@{/plugin/face/dat.gui.min.js}" th:inline="javascript"></script>
    <script th:src="@{/plugin/face/stats.min.js}" th:inline="javascript"></script>
       <div v-show="!showForm">
            <div class="demo-frame">
                <div class="demo-container">
                    <video id="video" width="420" height="420" preload autoplay loop muted></video>
                    <div>
                        <canvas id="canvas" width="420" height="340"></canvas>
                    </div>
                </div>
            </div>
        </div>

2、js

   getCompetence: function () {
            var that = this;
            var video = that.mediaStreamTrack = document.getElementById('video');
            var canvas = document.getElementById('canvas');
            var context = canvas.getContext('2d');
            var tracker = new tracking.ObjectTracker('face');
            tracker.setInitialScale(4);
            tracker.setStepSize(2);
            tracker.setEdgesDensity(0.1);
            this.trackerTask = tracking.track('#video', tracker, {camera: true});
            tracker.on('track', function (event) {
                context.clearRect(0, 0, canvas.width, canvas.height);
                event.data.forEach(function (rect) {
                    context.strokeStyle = '#a64ceb';
                    context.strokeRect(rect.x, rect.y, rect.width, rect.height);
                    context.font = '11px Helvetica';
                    context.fillStyle = "#fff";
                    context.fillText('x: ' + rect.x + 'px', rect.x + rect.width + 5, rect.y + 11);
                    context.fillText('y: ' + rect.y + 'px', rect.x + rect.width + 5, rect.y + 22);
                });
                //判断是否检测到人脸
                if (event.data.length) {
                    if (that.flag) {
                        context.drawImage(video, 0, 0, 420, 340);
                        var snapData = canvas.toDataURL('image/png');
                        var imgSrc = snapData;
                        that.flag = false
                        that.$http.post("../faceUpload/addFaceDb", {
                            jobNumber: that.addRuleForm.jobNumber,
                            username: that.addRuleForm.username,
                            base64: imgSrc,
                        }, {emulateJSON: true}).then(function (response) {
                            console.log(JSON.stringify(response))
                            if (response.body.code == "1") {
                                that.destroyed();
                                that.showForm = true;
                                that.$message({
                                    type: 'success',
                                    message: '采集成功。'
                                });
                                that.$refs['addRuleForm'].resetFields()
                            } else {
                                that.$message({
                                    type: 'error',
                                    message: response.body.msg
                                });
                                that.showForm = true;
                                that.destroyed();
                            }
                        });
                    }
                }
            });
        },
        //关闭操作
   destroyed: function () {
            console.log("结束")
            this.trackerTask.stop()
            this.mediaStreamTrack.srcObject.getTracks()[0].stop();
        }

提示:下载tracking.js

3、后台java+百度离线识别

  /**
  * 添加到人脸库
  */
  @RequestMapping("addFaceDb")
    @ResponseBody
    public ResultMsg addFaceDb(SysUser vo) throws IOException {
        if (vo != null) {
            List<SysUser> list = userService.getByJobNumber(vo);
            if (list.size() > 0) {
                return ResultMsg.errorWithData("0", "您已采集过人脸信息,请勿重新采集。", null);
            }
            //图像数据为空
            if (vo.getBase64() == null) {
                return ResultMsg.errorWithData("0", "未采集到人脸信息,请重试。", null);
            }
            BASE64Decoder decoder = new BASE64Decoder();
            try {
                //Base64解码
                String base641 = vo.getBase64().replace("data:image/png;base64,", "");
                byte[] b = decoder.decodeBuffer(base641);
                for (int i = 0; i < b.length; ++i) {
                    if (b[i] < 0) {//调整异常数据
                        b[i] += 256;
                    }
                }
                String nowHour = DateUtils.DateToString("HH");
                String nowMin = DateUtils.DateToString("mm");
                String nowSec = DateUtils.DateToString("ss");
                int random = (int) (100 + Math.random() * (999 - 100 + 100));
                String fileName = nowHour + nowMin + nowSec + random + ".png";
                // 创建保存文件夹
                String path = savePath + "face\\" + fileName;
                //采集人脸照片存放地址D:\nginx\www\movies\face
                String filePath2 = filePath + "face\\" + fileName;
                //新生成的图片
                OutputStream out = new FileOutputStream(filePath2);
                out.write(b);
                out.flush();
                out.close();
                //初始化
                Face.discern();
                //获取人脸图片质量
                String faceQuality = Face.faceQuality(filePath2);
                JSONObject quality = new JSONObject(faceQuality);
                if (("success").equals(quality.getString("msg"))) {
                    double illum = Double.parseDouble(quality.getJSONObject("data").getJSONObject("result").getString("illum"));
                    //人脸图片质量大于70,存入人脸库
                    if (illum > 70) {
                        //添加人脸库
                        String addInfo = Face.userAdd(vo.getJobNumber(), "0", filePath2, vo.getGzh());
                        //将返回结果转为JSON判断采集是否成功
                        System.err.println("addInfo=======" + addInfo);
                        JSONObject infoJson = new JSONObject(addInfo);
                        String msg = infoJson.getString("msg");
                        if (msg.equals("success")) {
                            SysUser user = new SysUser();
                            user.setId(UUIDUtil.getUUID());
                            user.setGzh(vo.getJobNumber());
                            user.setSfsc("0");
                            user.setUsername(vo.getUsername());
                            user.setFacetoken(infoJson.getJSONObject("data").getString("face_token"));
                            user.setBase64(vo.getBase64());
                            user.setPath(path);
                            userService.insertUser(user);
                        } else {
                            return ResultMsg.errorWithData("0", "添加人脸库失败。", null);
                        }
                        return ResultMsg.successWithData("1", "人脸采集成功!", vo);
                    } else {
                        return ResultMsg.errorWithData("0", "人脸照片不清晰,请重试。", null);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                return ResultMsg.errorWithData("0", "请求异常。", null);
            }
        }
        return ResultMsg.errorWithData(null);
    }

总结

如果发现浏览器请求时打不开摄像头参考上一个博客,后续再更新…。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值