logic.localizator.FaceLocalizator.java Source code

Java tutorial

Introduction

Here is the source code for logic.localizator.FaceLocalizator.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package logic.localizator;

import logic.helpclass.MatContainer;
import logic.helpclass.Parameters;
import jdk.nashorn.internal.objects.annotations.Constructor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.objdetect.CascadeClassifier;

/**
 * Localizes face, saves rezult in MatContainer as grayFaceMat, colorFaceMat,
 * faceRect
 * @author Igor Dumchykov
 */
public class FaceLocalizator implements LocalizatorIF {
    private static final Logger LOG = LogManager.getLogger(FaceLocalizator.class);

    private String HAAR_FACE = "haarcascades//haarcascade_frontalface_alt.xml";
    private CascadeClassifier faceCascade;

    public FaceLocalizator() {
        faceCascade = new CascadeClassifier(HAAR_FACE);
    }

    @Override
    public boolean localize(MatContainer mc) {
        //Extract face
        MatOfRect faceRectMat = new MatOfRect();
        faceCascade.detectMultiScale(mc.grayFrame, faceRectMat);

        Rect rMat[] = faceRectMat.toArray();

        LOG.info("Detected faces = " + rMat.length);

        if (Parameters.isDetectSingleFace) {
            if (rMat.length != 1)//need just 1 face
            {
                return false;
            }
        }

        LOG.trace("Face rect was detected");

        mc.faceRect = rMat[0];
        mc.grayFaceMat = mc.grayFrame.submat(rMat[0]);
        mc.colorFaceMat = mc.origFrame.submat(rMat[0]);

        //save face center
        mc.features.faceCenterPoint = new Point(rMat[0].x + rMat[0].width / 2, rMat[0].y + rMat[0].height / 2);

        return true;
    }

}