#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); ProMemory::getInstance().irisCam->startCapture(); break; case 3: // 双认证 先打开人脸识别 成功后再进行虹膜识别 ProMemory::getInstance().clearFaceQueue(); 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().irisCam->startCapture(); 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().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); // 停止控制电机和提示 ProMemory::getInstance().camPosCtrl->setWorking(false); 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().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); } else if (faceOrIris == 2) { this->personIdByIris = personId; ProMemory::getInstance().irisRecogPro->setWorking(false); ProMemory::getInstance().irisCam->stopCapture(); 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); } } } } void RecognizeResultForm::updateRecogTips(QString tipsText) { ui->labTitle->setText(tipsText); } void RecognizeResultForm::updateRecogTipsColor(QString bgColor) { ui->labTitle->setStyleSheet("background: " + bgColor); }