123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- const _my = require("../../__antmove/api/index.js")(my);
- const wx = _my;
- const { throttle } = require("./util/throttle");
- // components/catchFace/index.js
- Component({
- options: {
- lifetimes: true
- },
- /**
- * 组件的属性列表
- */
- properties: {
- countDown: {
- type: Number,
- value: 4
- },
- fake: {
- type: Boolean,
- value: true
- }
- },
- /**
- * 组件的初始数据
- */
- data: {
- tip: "请保持人脸在正中心位置",
- src: null,
- state: false,
- timer: null,
- countNumber: null,
- interval: null
- },
- /**
- * 组件的方法列表
- */
- methods: {
- // 打开摄像机监听器
- async listeningFace() {
- const that = this;
- await wx.initFaceDetect();
- const camera = wx.createCameraContext();
- const listener = camera.onCameraFrame(frame => {
- wx.faceDetect({
- frameBuffer: frame.data,
- width: frame.width,
- height: frame.height,
- enablePoint: true,
- enableConf: true,
- enableAngle: true,
- enableMultiFace: false,
- success: faceData => {
- that.judgeFace(faceData);
- },
- fail() {
- that.data.state = false;
- that.setData({
- tip: "未检测到人脸"
- });
- },
- complete() {
- that.judgeMove(camera, listener, that.data.countDown);
- }
- });
- });
- listener.start();
- },
- //判断人脸是否符合标准
- judgeFace: throttle(function(faceData) {
- if (faceData.detectRect.height < 170) {
- this.setData({
- tip: "请靠近一点"
- });
- this.data.state = false;
- return;
- }
- if (faceData.detectRect.height > 220) {
- this.setData({
- tip: "请离远一点"
- });
- this.data.state = false;
- return;
- }
- if (faceData.confArray.global < 0.8) {
- this.setData({
- tip: "请勿遮挡脸部"
- });
- this.data.state = false;
- return;
- }
- if (
- faceData.confArray.leftEye < 0.8 ||
- faceData.confArray.rightEye < 0.8
- ) {
- this.setData({
- tip: "请勿遮挡眼睛"
- });
- this.data.state = false;
- return;
- }
- if (
- Math.abs(faceData.angleArray.pitch) > 0.2 ||
- Math.abs(faceData.angleArray.yaw) > 0.2 ||
- Math.abs(faceData.angleArray.roll) > 0.1
- ) {
- this.setData({
- tip: "请正视屏幕"
- });
- this.data.state = false;
- return;
- }
- this.setData({
- tip: "请保持不动,正在抓拍中"
- });
- this.data.state = true;
- return;
- }, 500),
- //判断人脸是否相对静止,防止拍的照片模糊
- judgeMove(camera, listener, duration) {
- if (this.data.state === true) {
- if (this.data.timer === null) {
- this.countDown(duration);
- this.data.timer = setTimeout(() => {
- this.doTakePhoto(camera, listener);
- }, duration * 1000);
- }
- } else {
- clearTimeout(this.data.timer);
- clearInterval(this.data.interval);
- this.data.timer = null;
- this.data.interval = null;
- this.setData({
- countNumber: null
- });
- }
- },
- //抓拍倒计时
- countDown(count) {
- this.data.interval = setInterval(() => {
- if (count <= 0) {
- clearInterval(this.data.interval);
- this.data.interval = null;
- this.setData({
- countNumber: null
- });
- } else {
- count--;
- this.setData({
- countNumber: count
- });
- }
- }, 1000);
- },
- //抓拍照片
- doTakePhoto(camera, listener) {
- console.log("okkk");
- const that = this;
- camera.takePhoto({
- success(photo) {
- that.setData({
- src: photo.tempImagePath,
- tip: "抓拍成功",
- countNumber: null
- });
- listener.stop();
- that.triggerEvent("getPhoto", photo.tempImagePath);
- },
- fail(err) {
- console.log(err);
- }
- });
- }
- },
- //钩子
- lifetimes: {
- attached: function() {
- this.listeningFace();
- },
- detached: function() {}
- }
- });
|