Newer
Older
CasicBioRecNew / RecognizeResultForm.cpp
Tan Yue on 30 Jun 2022 10 KB 20220630 可以识别的1.0版本
#include "RecognizeResultForm.h"
#include "ui_RecognizeResultForm.h"

RecognizeResultForm::RecognizeResultForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RecognizeResultForm)
{
    ui->setupUi(this);
    ui->labVideo->hide();

    // 加载css文件设置控件样式
    QFile file(QApplication::applicationDirPath() + "/qss/recognize.css");
    if (file.open(QFile::ReadOnly))
    {
        QString qssStr = QLatin1String(file.readAll());
        this->setStyleSheet(qssStr);
        file.close();
    }
}

RecognizeResultForm::~RecognizeResultForm()
{
    delete ui;   
}

void RecognizeResultForm::startWorkingRecognize()
{
    // 开始人脸识别
    switch (SettingConfig::getInstance().RECOG_TYPE) {
    case 1:
        // 人脸识别
        ProMemory::getInstance().clearFaceQueue();
        ProMemory::getInstance().faceRecogPro->setWorking(true);
        break;
    case 2:
        // 虹膜识别
        ProMemory::getInstance().clearIrisQueue();
        ProMemory::getInstance().camPosCtrl->setWorking(true);
        ProMemory::getInstance().irisRecogPro->setWorking(true);
        break;
    case 3:
        // 双认证 先打开人脸识别 成功后再进行虹膜识别
        ProMemory::getInstance().clearFaceQueue();
        ProMemory::getInstance().clearIrisQueue();
        ProMemory::getInstance().faceRecogPro->setWorking(true);
        break;
    case 4:
        // 人脸和虹膜都需要打开
        ProMemory::getInstance().clearFaceQueue();
        ProMemory::getInstance().clearIrisQueue();
        ProMemory::getInstance().faceRecogPro->setWorking(true);
        ProMemory::getInstance().irisRecogPro->setWorking(true);
        ProMemory::getInstance().camPosCtrl->setWorking(true);
        break;
    }

    // 开始拍图并显示视频
    ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL);
    ui->labBackground->raise();

    // 1人脸图像显示的容器
    ui->labVideo->resize(1280, 720);
    ui->labVideo->move(0, 80);
    ui->labVideo->raise();
    ui->labVideo->show();

    ui->labTitle->raise();
    ui->labTitle->show();
    ui->labTitle->setText("正在识别");
    ui->labTitle->setStyleSheet("background: rgba(72, 80, 170, 0.75)");
}


void RecognizeResultForm::drawImageOnHomeForm(QImage imageDisp)
{
    if (ui->labVideo->isVisible() == true)
    {
        ui->labVideo->setPixmap(QPixmap::fromImage(imageDisp));
    }
}

void RecognizeResultForm::showRecogFailure()
{
    SpeakerUtil::getInstance().speak("识别失败,请重试");
    ui->labVideo->hide();
    ui->labTitle->hide();
    ui->widgetSucc->hide();

    ui->widgetFail->raise();
    ui->widgetFail->show();

    ProMemory::getInstance().clearIrisQueue();
    ProMemory::getInstance().irisRecogPro->setWorking(false);
//    ProMemory::getInstance().irisCam->stopCapture();
    ProMemory::getInstance().camPosCtrl->setWorking(false);

    ProMemory::getInstance().clearFaceQueue();
    ProMemory::getInstance().faceRecogPro->setWorking(false);

    QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){
        ui->labBackground->raise();
        CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START;

        emit backToHomeAndWait();
    });
}
void RecognizeResultForm::showRecognizeResult(QString personId)
{
    personIdByFace = "";
    personIdByIris = "";

    SpeakerUtil::getInstance().speak("识别成功");
    ui->labVideo->hide();
    ui->labTitle->hide();
    ui->widgetFail->hide();

    // 查询并显示人员信息
    SysPersonDao personDao;
    QVariantMap personInfo = personDao.findRecordById(personId);
    ui->labNameText->setText("");
    ui->labNameText->setText(personInfo.value("name").toString());
    ui->labGenderText->setText("");
    ui->labGenderText->setText(CacheManager::getInstance().getGenderName().value(personInfo.value("gender").toString()).toString());
    ui->labDeptText->setText("");
    ui->labDeptText->setText(personInfo.value("deptname").toString());
    ui->labTimeText->setText("");
    ui->labTimeText->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));

    FaceDataImgDao faceImgDao;
    QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId);
    if (photoImage.isEmpty() == false)
    {
        QString imageData = photoImage.find("face_image")->toString();
        QImage image;
        image.loadFromData(QByteArray::fromBase64(imageData.toLatin1()));
        image = image.scaledToHeight(280, Qt::SmoothTransformation);
        ui->labPhotot->setPixmap(QPixmap::fromImage(image));
    }

    ui->widgetSucc->raise();
    ui->widgetSucc->show();

    QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){
        CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START;
        ui->labBackground->raise();

        emit backToHomeAndWait();
    });
}

void RecognizeResultForm::checkRecognizeResult(QString personId, int faceOrIris)
{
    switch (SettingConfig::getInstance().RECOG_TYPE) {
    case 1:
    {
        // 仅人脸识别
        ProMemory::getInstance().faceRecogPro->setWorking(false);
        ProMemory::getInstance().faceCam->stopTakingPhoto();
        ProMemory::getInstance().clearFaceQueue();

        LOG(DEBUG) << QString("[RecognizeResultForm] 人脸识别成功 [%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString();

        // 识别记录存入数据库
        RecognitionRecordDao recDao;
        QVariantMap record;
        record.insert("person_id", personId);
        record.insert("date_time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
        record.insert("type", "1");
        record.insert("debug_info", CasicFaceRecState::getInstance().toString());
        recDao.save(record);

        showRecognizeResult(personId);

        break;
    }
    case 2:
    {
        // 仅虹膜识别
        ProMemory::getInstance().irisRecogPro->setWorking(false);
        ProMemory::getInstance().camPosCtrl->setWorking(false);
        ProMemory::getInstance().clearIrisQueue();

        LOG(DEBUG) << QString("[RecognizeResultForm] 虹膜识别成功 [%1]").arg(CasicIrisRecState::getInstance().toString()).toStdString();

        // 识别记录存入数据库
        RecognitionRecordDao recDao;
        QVariantMap record;
        record.insert("person_id", personId);
        record.insert("date_time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
        record.insert("type", "2");
        record.insert("debug_info", CasicIrisRecState::getInstance().toString());
        recDao.save(record);

        showRecognizeResult(personId);
        break;
    }
    case 4:
    {
        // 任意识别
        ProMemory::getInstance().irisRecogPro->setWorking(false);
//        ProMemory::getInstance().irisCam->stopCapture();
        ProMemory::getInstance().camPosCtrl->setWorking(false);
        ProMemory::getInstance().clearIrisQueue();

        ProMemory::getInstance().faceRecogPro->setWorking(false);
        ProMemory::getInstance().faceCam->stopTakingPhoto();
        ProMemory::getInstance().clearFaceQueue();

        QString logStr = QString("[RecognizeResultForm]%1识别成功[%2]");
        if (faceOrIris == 1)
        {
            logStr.arg("人脸").arg(CasicFaceRecState::getInstance().toString());
        } else if (faceOrIris == 2)
        {
            logStr.arg("虹膜").arg(CasicIrisRecState::getInstance().toString());
        }
        LOG(DEBUG) << logStr.toStdString();

        // 识别记录存入数据库
        RecognitionRecordDao recDao;
        QVariantMap record;
        record.insert("person_id", personId);
        record.insert("date_time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
        record.insert("type", QString::number(faceOrIris));
        record.insert("debug_info", faceOrIris == 1 ? CasicFaceRecState::getInstance().toString() : CasicIrisRecState::getInstance().toString());
        recDao.save(record);

        showRecognizeResult(personId);
        break;
    }
    case 3:
        if (faceOrIris == 1)
        {
            this->personIdByFace = personId;

            // 人脸识别成功后 开始进行虹膜识别
            // 1. 首先停止人脸识别
            ProMemory::getInstance().faceRecogPro->setWorking(false);
            ProMemory::getInstance().clearFaceQueue();

            // 2. 虹膜识别开始
            ProMemory::getInstance().clearIrisQueue();
            ProMemory::getInstance().camPosCtrl->setWorking(true);
            ProMemory::getInstance().irisRecogPro->setWorking(true);
        } else if (faceOrIris == 2)
        {
            this->personIdByIris = personId;

            ProMemory::getInstance().camPosCtrl->setWorking(false);
            ProMemory::getInstance().irisRecogPro->setWorking(false);
            ProMemory::getInstance().clearIrisQueue();

            if (personIdByFace.isEmpty() || personIdByIris.isEmpty())
            {
                // 只有一个成功的结果 需要等待下次
                return;
            } else if (personIdByFace != personIdByIris)
            {
                // 人脸和虹膜识别的不是同一人 识别失败
                LOG(DEBUG) << QString("[RecognizeResultForm] 虹膜与人脸识别结果不一致,识别失败 [face: %1][iris: %2]").arg(personIdByFace).arg(personIdByIris).toStdString();
                SpeakerUtil::getInstance().speak("虹膜与人脸识别结果不一致,识别失败,请重试");
                showRecogFailure();
            } else
            {
                LOG(DEBUG) << QString("[RecognizeResultForm]人脸虹膜识别成功").toStdString();
                showRecognizeResult(personId);

                // 识别记录存入数据库
                RecognitionRecordDao recDao;
                QVariantMap record;
                record.insert("person_id", personId);
                record.insert("date_time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
                record.insert("type", "3");
                record.insert("debug_info", CasicFaceRecState::getInstance().toString() + " " + CasicIrisRecState::getInstance().toString());
                recDao.save(record);
            }
        }
    }

    // 识别结束
    CasicFaceRecState::getInstance().recoginzeId = "0";
    CasicIrisRecState::getInstance().recoginzeId = "0";
}

void RecognizeResultForm::updateRecogTips(QString tipsText)
{
    ui->labTitle->setText(tipsText);
}
void RecognizeResultForm::updateRecogTipsColor(QString bgColor)
{
    ui->labTitle->setStyleSheet("background: " + bgColor);
}