Как получить определение положения лица внутри видео, используя face-api? - PullRequest
0 голосов
/ 05 ноября 2019

Я использую библиотеку face-api. https://github.com/justadudewhohacks/face-api.js

Я пытаюсь определить положение лица внутри видео.

Я хочу подать заявку. Это может установить мое лицо первой позиции. И тогда он может дать информацию о том, насколько сильно сместилось мое лицо.

Например, ширина моего видео = 600 пикселей, высота = 400 пикселей. Затем я хочу изменить положение глаз, например, положение моего левого глаза составляет 200 пикселей справа, 300 пикселей снизу. Это первая позиция моего левого глаза. После установки первой позиции, если я переехал, приложение показывает предупреждение или всплывающее окно.

1 Ответ

0 голосов
/ 06 ноября 2019

Прежде всего, создайте видео, транслируйте и загружайте все модели. Убедитесь, что вы загружаете все модели методом Promise.all().

Вы можете установить Face Detection и Face 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)
});

Тогда выможно получить Face Landmark точек и контуров.

Это для всех Face Landmark позиций:

const landmarkPositions = landmarks.positions

Это для позиций отдельных отметок:

// 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();

Для позиции левого глаза вы можете создать асинхронную функцию в 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));
    }
});
...