diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/images/bg_video.png b/images/bg_video.png deleted file mode 100644 index 3ed9dae..0000000 --- a/images/bg_video.png +++ /dev/null Binary files differ diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/images/bg_video.png b/images/bg_video.png deleted file mode 100644 index 3ed9dae..0000000 --- a/images/bg_video.png +++ /dev/null Binary files differ diff --git a/images/iconFailure.png b/images/iconFailure.png deleted file mode 100644 index e1d6403..0000000 --- a/images/iconFailure.png +++ /dev/null Binary files differ diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/images/bg_video.png b/images/bg_video.png deleted file mode 100644 index 3ed9dae..0000000 --- a/images/bg_video.png +++ /dev/null Binary files differ diff --git a/images/iconFailure.png b/images/iconFailure.png deleted file mode 100644 index e1d6403..0000000 --- a/images/iconFailure.png +++ /dev/null Binary files differ diff --git a/images/iconRetry.png b/images/iconRetry.png new file mode 100644 index 0000000..56cb235 --- /dev/null +++ b/images/iconRetry.png Binary files differ diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/images/bg_video.png b/images/bg_video.png deleted file mode 100644 index 3ed9dae..0000000 --- a/images/bg_video.png +++ /dev/null Binary files differ diff --git a/images/iconFailure.png b/images/iconFailure.png deleted file mode 100644 index e1d6403..0000000 --- a/images/iconFailure.png +++ /dev/null Binary files differ diff --git a/images/iconRetry.png b/images/iconRetry.png new file mode 100644 index 0000000..56cb235 --- /dev/null +++ b/images/iconRetry.png Binary files differ diff --git a/images/textRetryCHN.png b/images/textRetryCHN.png deleted file mode 100644 index 46ada75..0000000 --- a/images/textRetryCHN.png +++ /dev/null Binary files differ diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/images/bg_video.png b/images/bg_video.png deleted file mode 100644 index 3ed9dae..0000000 --- a/images/bg_video.png +++ /dev/null Binary files differ diff --git a/images/iconFailure.png b/images/iconFailure.png deleted file mode 100644 index e1d6403..0000000 --- a/images/iconFailure.png +++ /dev/null Binary files differ diff --git a/images/iconRetry.png b/images/iconRetry.png new file mode 100644 index 0000000..56cb235 --- /dev/null +++ b/images/iconRetry.png Binary files differ diff --git a/images/textRetryCHN.png b/images/textRetryCHN.png deleted file mode 100644 index 46ada75..0000000 --- a/images/textRetryCHN.png +++ /dev/null Binary files differ diff --git a/images/textRetryEn.png b/images/textRetryEn.png deleted file mode 100644 index b958492..0000000 --- a/images/textRetryEn.png +++ /dev/null Binary files differ diff --git a/AddPersonForm.cpp b/AddPersonForm.cpp index 86f0a73..64c9b5c 100644 --- a/AddPersonForm.cpp +++ b/AddPersonForm.cpp @@ -184,6 +184,9 @@ // 语音提示 SpeakerUtil::getInstance().speak(QString("人脸采集成功")); + // 重置识别状态码 + CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; + LOG(DEBUG) << "人脸采集成功"; if (personIdByFace == "") { @@ -325,6 +328,9 @@ faceValid.insert("face_valid", "1"); personDao.edit(faceValid, perIdReg); } + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 diff --git a/CasicBioRecWin.cpp b/CasicBioRecWin.cpp index 934dfad..efc73fd 100644 --- a/CasicBioRecWin.cpp +++ b/CasicBioRecWin.cpp @@ -69,6 +69,7 @@ { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; + ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { @@ -140,6 +141,9 @@ this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); + + connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, + this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() diff --git a/PersonListForm.cpp b/PersonListForm.cpp index d314f13..3cf2d72 100644 --- a/PersonListForm.cpp +++ b/PersonListForm.cpp @@ -269,6 +269,9 @@ if (succ == 1) { findPersonList(); + + // 重新加载人脸库 + ProMemory::getInstance().initFaceFeatures(); } } } diff --git a/PersonListForm.h b/PersonListForm.h index 65bd3f5..4e1b6b5 100644 --- a/PersonListForm.h +++ b/PersonListForm.h @@ -6,8 +6,10 @@ #include #include "ConfirmTipsDialog.h" #include "OperationTipsDialog.h" + #include "dao/util/CacheManager.h" #include "utils/UtilInclude.h" +#include "casic/ProMemory.h" namespace Ui { class PersonListForm; diff --git a/RecognizeResultForm.cpp b/RecognizeResultForm.cpp index b6790a9..b61cb09 100644 --- a/RecognizeResultForm.cpp +++ b/RecognizeResultForm.cpp @@ -32,10 +32,15 @@ ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL); // 1人脸图像显示的容器 - ui->labVideo->resize(1060, 607); - ui->labVideo->move(110, 100); + 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)"); } @@ -43,18 +48,62 @@ { if (ui->labVideo->isVisible() == true) { - LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height(); - imageDisp = imageDisp.scaled(1040, 585); 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(); + + QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } void RecognizeResultForm::showRecognizeResult(QString personId) { SpeakerUtil::getInstance().speak("识别成功"); -// ui->labVideo->hide(); + 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, [=](){ + emit backToHomeAndWait(); + CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START; + ui->labBackground->raise(); + }); } diff --git a/RecognizeResultForm.h b/RecognizeResultForm.h index 3be5410..f5ef019 100644 --- a/RecognizeResultForm.h +++ b/RecognizeResultForm.h @@ -6,6 +6,10 @@ #include "utils/UtilInclude.h" #include "casic/ProMemory.h" +#include "dao/SysPersonDao.h" +#include "dao/FaceDataImgDao.h" +#include "dao/util/CacheManager.h" +#include "utils/UtilInclude.h" namespace Ui { class RecognizeResultForm; @@ -29,6 +33,9 @@ private: Ui::RecognizeResultForm *ui; +signals: + void backToHomeAndWait(); // 识别结束 返回主界面并待机 + }; #endif // RECOGNIZERESULTFORM_H diff --git a/RecognizeResultForm.ui b/RecognizeResultForm.ui index 897a7ae..53e8bdf 100644 --- a/RecognizeResultForm.ui +++ b/RecognizeResultForm.ui @@ -58,7 +58,7 @@ - 人员识别 + Qt::AlignCenter @@ -86,7 +86,7 @@ - border: 2px solid #FFFFFF; + :/images/photoFace.png @@ -105,9 +105,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 时间 @@ -123,9 +121,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 姓名 @@ -141,9 +137,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 部门 @@ -159,9 +153,7 @@ - font-size: 36px; -color: #FFFFFF; -font-family: "Microsoft Yahei"; + 性别 @@ -177,11 +169,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -197,11 +185,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -217,11 +201,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -237,11 +217,7 @@ - background: #FFFFFF; -border-radius: 12px; -border: 2px solid #FFFFFF; -color: #666666; -font-size: 30px; + @@ -251,69 +227,18 @@ - 190 - 120 - 900 - 600 + 0 + 0 + 1280 + 800 - - - - 120 - 110 - 280 - 380 - - - - - - - :/images/iconFailure.png - - - Qt::AlignCenter - - - - - - 500 - 200 - 300 - 100 - - - - - - - :/images/textRetryCHN.png - - - - - - 500 - 300 - 300 - 100 - - - - - - - :/images/textRetryEn.png - - - widgetFail - labBackground labVideo - labTitle widgetSucc + labBackground + widgetFail + labTitle diff --git a/StartupForm.cpp b/StartupForm.cpp index c8b9c64..272e8f1 100644 --- a/StartupForm.cpp +++ b/StartupForm.cpp @@ -54,6 +54,12 @@ return; } + // 不在这个页面 则直接返回 不做后续判断 + if (ProMemory::getInstance().widgeFrame != CasicBioRecConst::WidgeFrameName::MAIN_PAGE) + { + return; + } + cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame(); bool hasFace = casic::face::CasicFaceInterface::getInstance().hasFaceDetectedByCVCascade(rawFrame, 100); if (hasFace == true) diff --git a/dao/SysDictDao.cpp b/dao/SysDictDao.cpp new file mode 100644 index 0000000..cceef79 --- /dev/null +++ b/dao/SysDictDao.cpp @@ -0,0 +1,88 @@ +#include "SysDictDao.h" + + +SysDictDao::SysDictDao(QObject *parent) : BaseDao(parent) +{ + +} + +QVector SysDictDao::findAllRecord() +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT"; + + // 执行查询 + query.exec(sql); + + // 返回结果 + QVector result; + + // 遍历查询结果 + while (query.next()) { + QVariantMap item; + + item.insert("id", query.value("id").toLongLong()); + item.insert("code", query.value("code").toString()); + item.insert("name", query.value("name").toString()); + item.insert("pid", query.value("pid").toString()); + + result.append(item); + } + + return result; +} + +QVariantMap SysDictDao::findRecordById(QString id) +{ + QVariantMap item; + return item; +} + + +QVector SysDictDao::findRecordsByProperty(QString properName, QVariant properValue) +{ + QVector result; + return result; +} + +QVariantMap SysDictDao::findChildDictByCode(QString code) +{ + // 新建查询 + QSqlQuery query(ConnectionManager::getInstance()->getConnection()); + + // 查询语句 + QString sql = "SELECT * FROM SYS_DICT where PID = (SELECT ID FROM SYS_DICT WHERE CODE = :code)"; + query.prepare(sql); + query.bindValue(":code", code); + + // 执行查询 + query.exec(); + + // 返回结果 + QVariantMap result; + + // 遍历查询结果 + while (query.next()) { + result.insert(query.value("code").toString(), query.value("name").toString()); + } + + return result; +} + +QString SysDictDao::save(QVariantMap object) +{ + return "0"; +} + +bool SysDictDao::edit(QVariantMap newObject, QString id) +{ + return false; +} + +bool SysDictDao::dele(QString id) +{ + return false; +} diff --git a/dao/SysDictDao.h b/dao/SysDictDao.h new file mode 100644 index 0000000..55a9160 --- /dev/null +++ b/dao/SysDictDao.h @@ -0,0 +1,24 @@ +#ifndef SYSDICTDAO_H +#define SYSDICTDAO_H + +#include +#include "BaseDao.h" + +class SysDictDao : public BaseDao +{ + Q_OBJECT +public: + explicit SysDictDao(QObject *parent = nullptr); + + QVector findAllRecord(); + QVariantMap findRecordById(QString id); + QVector findRecordsByProperty(QString properName, QVariant properValue); + + QVariantMap findChildDictByCode(QString code); + + QString save(QVariantMap object); + bool edit(QVariantMap newObject, QString id); + bool dele(QString id); +}; + +#endif // SYSDICTDAO_H diff --git a/dao/dao.pri b/dao/dao.pri index baac701..5f92891 100644 --- a/dao/dao.pri +++ b/dao/dao.pri @@ -8,6 +8,7 @@ HEADERS += $$PWD/SysConfigDao.h HEADERS += $$PWD/SysPersonDao.h HEADERS += $$PWD/SysDeptDao.h +HEADERS += $$PWD/SysDictDao.h HEADERS += $$PWD/util/ConnectionManager.h HEADERS += $$PWD/util/CacheManager.h @@ -20,6 +21,7 @@ SOURCES += $$PWD/SysConfigDao.cpp SOURCES += $$PWD/SysPersonDao.cpp SOURCES += $$PWD/SysDeptDao.cpp +SOURCES += $$PWD/SysDictDao.cpp SOURCES += $$PWD/util/ConnectionManager.cpp SOURCES += $$PWD/util/CacheManager.cpp diff --git a/dao/util/CacheManager.cpp b/dao/util/CacheManager.cpp index b763174..92b392b 100644 --- a/dao/util/CacheManager.cpp +++ b/dao/util/CacheManager.cpp @@ -3,6 +3,9 @@ CacheManager::CacheManager() { deptCache = new QList(); + + SysDictDao dictDao; + genderName = dictDao.findChildDictByCode("gender"); } QList * CacheManager::getDeptCachePtr() @@ -10,6 +13,11 @@ return deptCache; } +QVariantMap CacheManager::getGenderName() +{ + return genderName; +} + void CacheManager::updateDeptCache() { SysDeptDao deptDao; diff --git a/dao/util/CacheManager.h b/dao/util/CacheManager.h index 5ab9395..b6dddb7 100644 --- a/dao/util/CacheManager.h +++ b/dao/util/CacheManager.h @@ -4,6 +4,7 @@ #include #include #include "dao/SysDeptDao.h" +#include "dao/SysDictDao.h" #include "dao/SysPersonDao.h" #include "dao/FaceDataDao.h" #include "dao/FaceDataImgDao.h" @@ -23,6 +24,7 @@ } QList * getDeptCachePtr(); + QVariantMap getGenderName(); void updateDeptCache(); @@ -30,6 +32,7 @@ CacheManager(); QList * deptCache; + QVariantMap genderName; }; #endif // CACHEMANAGER_H diff --git a/device/FaceCameraController.cpp b/device/FaceCameraController.cpp index 493fdb7..5cb98e5 100644 --- a/device/FaceCameraController.cpp +++ b/device/FaceCameraController.cpp @@ -14,10 +14,6 @@ .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX) .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH) .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString(); - - // 获取定时器, 绑定定时函数 - connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, - this, &FaceCameraController::getOneFaceFrm); } FaceCameraController::~FaceCameraController() @@ -28,6 +24,12 @@ void FaceCameraController::openFaceCamera(int mInterval) { + stopTakingPhoto(); + + // 获取定时器, 绑定定时函数 + connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout, + this, &FaceCameraController::getOneFaceFrm); + // 启动定时器 TimeCounterUtil::getInstance().faceCapCounter->start(mInterval); LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString(); diff --git a/device/face/FaceDetectRecogProcess.cpp b/device/face/FaceDetectRecogProcess.cpp index 00e45ff..d8d6d01 100644 --- a/device/face/FaceDetectRecogProcess.cpp +++ b/device/face/FaceDetectRecogProcess.cpp @@ -134,7 +134,6 @@ LOG(DEBUG) << QString("[CasicFaceRecognize] 特征提取成功[%1]").arg(CasicFaceRecState::getInstance().toString()).toStdString(); - this->setWorking(false); // 特征值提取成功的人脸 与人脸库中的人脸进行比较 compareFaceInCollection(); } @@ -169,11 +168,11 @@ // 找到匹配的人脸图像 this->afterRecogAction(ffMap.value("person_id").toString()); + this->setWorking(false); // 找到匹配的人脸之后停止识别线程工作 return ; } } - ProMemory::getInstance().clearFaceQueue(); // 清理人脸数据栈 this->addOneTryCount(); } diff --git a/images/bg_recognize_result.png b/images/bg_recognize_result.png index 068b55b..53c37ed 100644 --- a/images/bg_recognize_result.png +++ b/images/bg_recognize_result.png Binary files differ diff --git a/images/bg_video.png b/images/bg_video.png deleted file mode 100644 index 3ed9dae..0000000 --- a/images/bg_video.png +++ /dev/null Binary files differ diff --git a/images/iconFailure.png b/images/iconFailure.png deleted file mode 100644 index e1d6403..0000000 --- a/images/iconFailure.png +++ /dev/null Binary files differ diff --git a/images/iconRetry.png b/images/iconRetry.png new file mode 100644 index 0000000..56cb235 --- /dev/null +++ b/images/iconRetry.png Binary files differ diff --git a/images/textRetryCHN.png b/images/textRetryCHN.png deleted file mode 100644 index 46ada75..0000000 --- a/images/textRetryCHN.png +++ /dev/null Binary files differ diff --git a/images/textRetryEn.png b/images/textRetryEn.png deleted file mode 100644 index b958492..0000000 --- a/images/textRetryEn.png +++ /dev/null Binary files differ diff --git a/resource.qrc b/resource.qrc index 940e847..e0d4237 100644 --- a/resource.qrc +++ b/resource.qrc @@ -23,9 +23,6 @@ images/tipsSuccess.png images/tipsConfirm.png images/bg_recognize_result.png - images/bg_video.png - images/iconFailure.png - images/textRetryCHN.png - images/textRetryEn.png + images/iconRetry.png