Newer
Older
CasicBioRecNew / device / face / FaceDetectRegistProcess.cpp
#include "FaceDetectRegistProcess.h"

FaceDetectRegistProcess::FaceDetectRegistProcess(QObject *parent) : QObject(parent)
{

}

void FaceDetectRegistProcess::faceDetect(cv::Mat faceMat)
{
    LOG(DEBUG) << "START FACE DETECT" << FACE_DETECT_FLAG;

    // 如果已经在人脸检测工作中则退出
    if (FACE_DETECT_FLAG == true)
    {
        LOG(DEBUG) << "ALREADY IN FACE DETECT PROCESS";
        return;
    }

    // 开始人脸检测
    FACE_DETECT_FLAG = true;
    LOG(DEBUG) << "START FACE DETECT";

    // 调用人脸检测算法
    CasicFaceInfo faceInfo = casic::face::CasicFaceInterface::getInstance().faceDetect(faceMat);
    if (faceInfo.hasFace == false)
    {
        // 没有找到人脸进行如下处理


        // 结束检测 重置工作标志位
        FACE_DETECT_FLAG = false;
        return;
    }

    // 继续进行后面的步骤
    // 开始人脸活体检测, 提高活体检测的阈值到0.3/0.6
    casic::face::CasicFaceInterface::getInstance().setAntiThreshold(0.3, 0.6);
    faceInfo = casic::face::CasicFaceInterface::getInstance().faceAntiSpoofing(faceInfo);
    // 活体检测判断为假脸
    if (faceInfo.antiStatus != seeta::FaceAntiSpoofing::Status::REAL)
    {
        // 表示本次识别结束, 可以开始下一次识别过程
        LOG(DEBUG) << QString("[faceDetect]人脸活体检测未通过").toStdString();

        FACE_DETECT_FLAG = false;
        return;
    }

    // 判定为真实人脸, 开始质量评估
    faceInfo = casic::face::CasicFaceInterface::getInstance().faceQuality(faceInfo);

    // 质量评估不为HIGH则返回
    if (faceInfo.quality.level != seeta::QualityLevel::HIGH)
    {
        // 表示本次识别结束, 可以开始下一次识别过程
        LOG(DEBUG) << QString("[faceDetect]人脸质量评估未通过").toStdString();

        FACE_DETECT_FLAG = false;
        return;
    }

    // 调用算法提取特征值, 1024个字节的float数组
    faceInfo = casic::face::CasicFaceInterface::getInstance().faceFeatureExtract(faceInfo);

    LOG(DEBUG) << QString("[faceDetect]特征提取成功").toStdString();

    // 发送信号去进行比对, 执行后续业务逻辑
    emit this->extractFeatureSuccess(CasicFaceRecState::getInstance());

    // 结束检测 重置工作标志位
    FACE_DETECT_FLAG = false;
}