如何使用face-api获取视频中的人脸位置检测?

Nao*_*Nao 0 javascript face-api facial-identification

我正在使用 face-api 库。 https://github.com/justadudewhohacks/face-api.js

我正在尝试获取视频中的面部位置。

我想申请。它可以设置我的脸第一位置。然后它可以提供信息我的脸移动了多少。

例如,我的视频宽度 = 600 像素,高度 = 400 像素。然后我想得到我的眼睛位置,比如我的左眼位置离右边 200 像素,离底部 300 像素。那是我左眼的第一个位置。设置第一个位置后,如果我移动,应用程序会显示警报或弹出窗口。

Ömü*_*giz 6

首先,创建视频、流并加载所有模型。确保在Promise.all()方法中加载所有模型。

您可以像这样设置Face DetectionFace Landmarks

video.addEventListener('play', () => {
    // Create canvas from our video element
    const canvas = faceapi.createCanvasFromMedia(video);
    document.body.append(canvas);
    // Current size of our video
    const displaySize = { width: video.width, height: video.height }
    faceapi.matchDimensions(canvas, displaySize);
    // run the code multiple times in a row --> setInterval
    //  async func 'cause it's a async library
    setInterval(async () => {
        // Every 100ms, get all the faces inside of the webcam image to video element
        const detections = await faceapi.detectAllFaces(video, 
        new faceapi.TinyFaceDetectorOptions())
        .withFaceLandmarks().withFaceExpressions();
        // boxes will size properly for the video element
        const resizedDetections = faceapi.resizeResults(detections, displaySize);
        // get 2d context and clear it from 0, 0, ...
        canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
        faceapi.draw.drawDetections(canvas, resizedDetections);
        faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);
        faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
    }, 100)
});
Run Code Online (Sandbox Code Playgroud)

然后您可以检索Face Landmark点和轮廓。

这适用于所有Face Landmark职位:

const landmarkPositions = landmarks.positions
Run Code Online (Sandbox Code Playgroud)

这对于单个标记的位置:

// only available for 68 point face landmarks (FaceLandmarks68)
const jawOutline = landmarks.getJawOutline();
const nose = landmarks.getNose();
const mouth = landmarks.getMouth();
const leftEye = landmarks.getLeftEye();
const rightEye = landmarks.getRightEye();
const leftEyeBrow = landmarks.getLeftEyeBrow();
const rightEyeBrow = landmarks.getRightEyeBrow();
Run Code Online (Sandbox Code Playgroud)

对于左眼的位置,可以在里面创建一个异步函数video.addEventListener,获取左眼的第一个位置:

video.addEventListener('play', () => {
    ...
    async function leftEyePosition() {
         const landmarks = await faceapi.detectFaceLandmarks(video)
         const leftEye = landmarks.getLeftEye();
         console.log("Left eye position ===>" + JSON.stringify(leftEye));
    }
});
Run Code Online (Sandbox Code Playgroud)