<template>
<div class="wrapp">
<div
class="status"
:style="{ color: msg === '检测到人脸' ? 'green' : 'red' }">
{{ msg }}
</div>
<div class="rWrapp">
<video id="myVideo" preload="preload" autoplay loop muted />
<canvas ref="myCanvas" class="myCanvas" width="200" height="200" ></canvas>
</div>
<div class="flex align-items please-do-not justify-content-sb">
<div>
<img src="@/assets/img/eyes.png"
alt="">
<p>不能佩戴眼睛</p>
</div>
<div>
<img src="@/assets/img/face.png"
alt="">
<p>不能遮挡脸部</p>
</div>
<div>
<img src="@/assets/img/face-upward.png"
alt="">
<p>不能仰头俯拍</p>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { Toast } from "vant";
const msg = ref<string>("没识别到人脸...");
let trackerTask: any = null;
// 标识用的画布
const myCanvas = ref<HTMLCanvasElement | null>(null);
// 实例颜色检查器
const myTracker: any = new tracking.ObjectTracker("face");
myTracker.setInitialScale(4);
myTracker.setStepSize(2);
myTracker.setEdgesDensity(0.1);
// 监听颜色检查器
myTracker.on("track", (event: tracking.TrackEvent) => {
const context = myCanvas.value?.getContext("2d") as CanvasRenderingContext2D;
if (myCanvas.value) {
context.clearRect(0, 0, myCanvas.value.width, myCanvas.value.height);
}
if (event.data.length === 0) {
msg.value = "没识别到人脸...";
} else {
trackerTask.stop();
msg.value = "检测到人脸";
const myVideo = document.querySelector("#myVideo") as HTMLVideoElement;
context.drawImage(myVideo, 0, 0, 210, 200);
setTimeout(() => {
Toast.success("识别成功");
}, 1000);
// @ts-ignore
if (typeof window.stream === "object") {
myVideo.srcObject = null;
// @ts-ignore
window.stream.getTracks().forEach((track) => track.stop());
}
}
});
onMounted(() => {
// 触发颜色检查器
trackerTask = tracking.track("#myVideo", myTracker, { camera: true });
});
</script>
<style lang="less" scoped>
.wrapp {
height: 100%;
background: url('../assets/img/background.png') no-repeat;
background-size: 100% 100%;
padding-top: 100px;
.rWrapp {
width: 200px;
height: 200px;
margin: auto;
margin-top: 30px;
position: relative;
.myCanvas {
position: absolute;
top: 0;
left: 0;
border-radius: 50%;
width: 100%;
height: 100%;
}
#myVideo {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
}
}
.status {
//margin-top: 100px;
text-align: center;
}
.please-do-not {
padding: 0 11.7%;
display: flex;
align-items: center;
justify-content: space-between;
div {
text-align: center;
}
img {
width: 1.08rem;
margin-bottom: 5%;
}
p {
font-family: PingFangSC-Regular;
font-size: .26rem;
color: rgba(255,255,255,0.60);
letter-spacing: 0;
}
}
}
</style>