#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; }