diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 2ad8c87..5ca377e 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -43,7 +43,7 @@ continue; } - // 图像栈中没有图像则直接返回 + // 1. 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); @@ -51,7 +51,7 @@ continue; } - // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 + // 2. 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); @@ -59,16 +59,14 @@ continue; } - // 取出虹膜图像栈中的一条数据 - // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); + // 3. 取出虹膜图像栈中的一条数据 CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); + // 4. 调用找眼分类器算法 + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(SettingConfig::getInstance().MIN_EYE_SIZE); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); - // irisInfo.hasEye = true; - // 没有找到眼睛则返回 + // 4.1 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 @@ -79,7 +77,11 @@ continue; } - // 找到眼睛则开始质量评估和编码 + // 4.2 找到眼睛则开始识别 + + // 发送信号更新界面 + emit startIdentifyIris(); + // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") { @@ -89,12 +91,6 @@ CasicIrisRecState::getInstance().noEyeCount = 0; // 持续未找到眼的次数清零 CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FIND_EYE; - // CasicIrisRecState::getInstance().irisInfo->hasEye = irisInfo.hasEye; - // CasicIrisRecState::getInstance().irisInfo->eyeRect = irisInfo.eyeRect; - // CasicIrisRecState::getInstance().irisInfo->matData = irisInfo.matData; - // CasicIrisRecState::getInstance().irisInfo->data = ImageUtil::MatImageToQImage(irisInfo.matData); - - // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); @@ -244,17 +240,39 @@ } void IrisRecogProcess::addOneNoEyeCount() { - CasicIrisRecState::getInstance().noEyeCount++; - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_IDENTIFYING) { - CasicIrisRecState::getInstance().noEyeCount = 0; + CasicIrisRecState::getInstance().noEyeCount++; - this->setWorking(false); - ProMemory::getInstance().irisCam->stopCapture(); - ProMemory::getInstance().clearIrisQueue(); + // 如果在识别中 则超过一定次数后返回识别失败 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + { + // 发送信号识别失败 + emit failedMatchedIris(); - emit failedMatchedIris(); + CasicIrisRecState::getInstance().noEyeCount = 0; + // 识别失败时暂停工作 待返回识别界面时再开始工作和拍图 + this->setWorking(false); + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + } + } else if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_WORKING) + { + CasicIrisRecState::getInstance().noEyeCount++; + + // 如果在工作状态 则超过一定次数后返回待机 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_FACE_NOT_FOUND_COUNT) + { + // 发送信号待机 + emit backToLockScreen(); + + CasicIrisRecState::getInstance().noEyeCount = 0; + + // 待机界面还在拍图和工作 + ProMemory::getInstance().clearIrisQueue(); + } + } else { + // 待机界面 不做处理 等待找到眼 } } diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 2ad8c87..5ca377e 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -43,7 +43,7 @@ continue; } - // 图像栈中没有图像则直接返回 + // 1. 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); @@ -51,7 +51,7 @@ continue; } - // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 + // 2. 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); @@ -59,16 +59,14 @@ continue; } - // 取出虹膜图像栈中的一条数据 - // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); + // 3. 取出虹膜图像栈中的一条数据 CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); + // 4. 调用找眼分类器算法 + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(SettingConfig::getInstance().MIN_EYE_SIZE); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); - // irisInfo.hasEye = true; - // 没有找到眼睛则返回 + // 4.1 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 @@ -79,7 +77,11 @@ continue; } - // 找到眼睛则开始质量评估和编码 + // 4.2 找到眼睛则开始识别 + + // 发送信号更新界面 + emit startIdentifyIris(); + // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") { @@ -89,12 +91,6 @@ CasicIrisRecState::getInstance().noEyeCount = 0; // 持续未找到眼的次数清零 CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FIND_EYE; - // CasicIrisRecState::getInstance().irisInfo->hasEye = irisInfo.hasEye; - // CasicIrisRecState::getInstance().irisInfo->eyeRect = irisInfo.eyeRect; - // CasicIrisRecState::getInstance().irisInfo->matData = irisInfo.matData; - // CasicIrisRecState::getInstance().irisInfo->data = ImageUtil::MatImageToQImage(irisInfo.matData); - - // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); @@ -244,17 +240,39 @@ } void IrisRecogProcess::addOneNoEyeCount() { - CasicIrisRecState::getInstance().noEyeCount++; - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_IDENTIFYING) { - CasicIrisRecState::getInstance().noEyeCount = 0; + CasicIrisRecState::getInstance().noEyeCount++; - this->setWorking(false); - ProMemory::getInstance().irisCam->stopCapture(); - ProMemory::getInstance().clearIrisQueue(); + // 如果在识别中 则超过一定次数后返回识别失败 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + { + // 发送信号识别失败 + emit failedMatchedIris(); - emit failedMatchedIris(); + CasicIrisRecState::getInstance().noEyeCount = 0; + // 识别失败时暂停工作 待返回识别界面时再开始工作和拍图 + this->setWorking(false); + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + } + } else if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_WORKING) + { + CasicIrisRecState::getInstance().noEyeCount++; + + // 如果在工作状态 则超过一定次数后返回待机 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_FACE_NOT_FOUND_COUNT) + { + // 发送信号待机 + emit backToLockScreen(); + + CasicIrisRecState::getInstance().noEyeCount = 0; + + // 待机界面还在拍图和工作 + ProMemory::getInstance().clearIrisQueue(); + } + } else { + // 待机界面 不做处理 等待找到眼 } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index f0bd229..9a3eec6 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -41,6 +41,8 @@ signals: void sendDataToExract(QByteArray data); + void backToLockScreen(); + void startIdentifyIris(); void failedMatchedIris(); void findMatchedIris(QString personId); diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 2ad8c87..5ca377e 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -43,7 +43,7 @@ continue; } - // 图像栈中没有图像则直接返回 + // 1. 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); @@ -51,7 +51,7 @@ continue; } - // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 + // 2. 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); @@ -59,16 +59,14 @@ continue; } - // 取出虹膜图像栈中的一条数据 - // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); + // 3. 取出虹膜图像栈中的一条数据 CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); + // 4. 调用找眼分类器算法 + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(SettingConfig::getInstance().MIN_EYE_SIZE); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); - // irisInfo.hasEye = true; - // 没有找到眼睛则返回 + // 4.1 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 @@ -79,7 +77,11 @@ continue; } - // 找到眼睛则开始质量评估和编码 + // 4.2 找到眼睛则开始识别 + + // 发送信号更新界面 + emit startIdentifyIris(); + // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") { @@ -89,12 +91,6 @@ CasicIrisRecState::getInstance().noEyeCount = 0; // 持续未找到眼的次数清零 CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FIND_EYE; - // CasicIrisRecState::getInstance().irisInfo->hasEye = irisInfo.hasEye; - // CasicIrisRecState::getInstance().irisInfo->eyeRect = irisInfo.eyeRect; - // CasicIrisRecState::getInstance().irisInfo->matData = irisInfo.matData; - // CasicIrisRecState::getInstance().irisInfo->data = ImageUtil::MatImageToQImage(irisInfo.matData); - - // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); @@ -244,17 +240,39 @@ } void IrisRecogProcess::addOneNoEyeCount() { - CasicIrisRecState::getInstance().noEyeCount++; - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_IDENTIFYING) { - CasicIrisRecState::getInstance().noEyeCount = 0; + CasicIrisRecState::getInstance().noEyeCount++; - this->setWorking(false); - ProMemory::getInstance().irisCam->stopCapture(); - ProMemory::getInstance().clearIrisQueue(); + // 如果在识别中 则超过一定次数后返回识别失败 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + { + // 发送信号识别失败 + emit failedMatchedIris(); - emit failedMatchedIris(); + CasicIrisRecState::getInstance().noEyeCount = 0; + // 识别失败时暂停工作 待返回识别界面时再开始工作和拍图 + this->setWorking(false); + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + } + } else if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_WORKING) + { + CasicIrisRecState::getInstance().noEyeCount++; + + // 如果在工作状态 则超过一定次数后返回待机 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_FACE_NOT_FOUND_COUNT) + { + // 发送信号待机 + emit backToLockScreen(); + + CasicIrisRecState::getInstance().noEyeCount = 0; + + // 待机界面还在拍图和工作 + ProMemory::getInstance().clearIrisQueue(); + } + } else { + // 待机界面 不做处理 等待找到眼 } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index f0bd229..9a3eec6 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -41,6 +41,8 @@ signals: void sendDataToExract(QByteArray data); + void backToLockScreen(); + void startIdentifyIris(); void failedMatchedIris(); void findMatchedIris(QString personId); diff --git a/images/lock.png b/images/lock.png new file mode 100644 index 0000000..6f8e677 --- /dev/null +++ b/images/lock.png Binary files differ diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 2ad8c87..5ca377e 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -43,7 +43,7 @@ continue; } - // 图像栈中没有图像则直接返回 + // 1. 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); @@ -51,7 +51,7 @@ continue; } - // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 + // 2. 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); @@ -59,16 +59,14 @@ continue; } - // 取出虹膜图像栈中的一条数据 - // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); + // 3. 取出虹膜图像栈中的一条数据 CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); + // 4. 调用找眼分类器算法 + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(SettingConfig::getInstance().MIN_EYE_SIZE); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); - // irisInfo.hasEye = true; - // 没有找到眼睛则返回 + // 4.1 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 @@ -79,7 +77,11 @@ continue; } - // 找到眼睛则开始质量评估和编码 + // 4.2 找到眼睛则开始识别 + + // 发送信号更新界面 + emit startIdentifyIris(); + // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") { @@ -89,12 +91,6 @@ CasicIrisRecState::getInstance().noEyeCount = 0; // 持续未找到眼的次数清零 CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FIND_EYE; - // CasicIrisRecState::getInstance().irisInfo->hasEye = irisInfo.hasEye; - // CasicIrisRecState::getInstance().irisInfo->eyeRect = irisInfo.eyeRect; - // CasicIrisRecState::getInstance().irisInfo->matData = irisInfo.matData; - // CasicIrisRecState::getInstance().irisInfo->data = ImageUtil::MatImageToQImage(irisInfo.matData); - - // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); @@ -244,17 +240,39 @@ } void IrisRecogProcess::addOneNoEyeCount() { - CasicIrisRecState::getInstance().noEyeCount++; - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_IDENTIFYING) { - CasicIrisRecState::getInstance().noEyeCount = 0; + CasicIrisRecState::getInstance().noEyeCount++; - this->setWorking(false); - ProMemory::getInstance().irisCam->stopCapture(); - ProMemory::getInstance().clearIrisQueue(); + // 如果在识别中 则超过一定次数后返回识别失败 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + { + // 发送信号识别失败 + emit failedMatchedIris(); - emit failedMatchedIris(); + CasicIrisRecState::getInstance().noEyeCount = 0; + // 识别失败时暂停工作 待返回识别界面时再开始工作和拍图 + this->setWorking(false); + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + } + } else if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_WORKING) + { + CasicIrisRecState::getInstance().noEyeCount++; + + // 如果在工作状态 则超过一定次数后返回待机 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_FACE_NOT_FOUND_COUNT) + { + // 发送信号待机 + emit backToLockScreen(); + + CasicIrisRecState::getInstance().noEyeCount = 0; + + // 待机界面还在拍图和工作 + ProMemory::getInstance().clearIrisQueue(); + } + } else { + // 待机界面 不做处理 等待找到眼 } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index f0bd229..9a3eec6 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -41,6 +41,8 @@ signals: void sendDataToExract(QByteArray data); + void backToLockScreen(); + void startIdentifyIris(); void failedMatchedIris(); void findMatchedIris(QString personId); diff --git a/images/lock.png b/images/lock.png new file mode 100644 index 0000000..6f8e677 --- /dev/null +++ b/images/lock.png Binary files differ diff --git a/resource.qrc b/resource.qrc index 9d964c6..0931777 100644 --- a/resource.qrc +++ b/resource.qrc @@ -8,5 +8,6 @@ images/iconWarn.png images/photo.png images/bg_success.png + images/lock.png diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 2ad8c87..5ca377e 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -43,7 +43,7 @@ continue; } - // 图像栈中没有图像则直接返回 + // 1. 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); @@ -51,7 +51,7 @@ continue; } - // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 + // 2. 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); @@ -59,16 +59,14 @@ continue; } - // 取出虹膜图像栈中的一条数据 - // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); + // 3. 取出虹膜图像栈中的一条数据 CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); + // 4. 调用找眼分类器算法 + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(SettingConfig::getInstance().MIN_EYE_SIZE); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); - // irisInfo.hasEye = true; - // 没有找到眼睛则返回 + // 4.1 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 @@ -79,7 +77,11 @@ continue; } - // 找到眼睛则开始质量评估和编码 + // 4.2 找到眼睛则开始识别 + + // 发送信号更新界面 + emit startIdentifyIris(); + // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") { @@ -89,12 +91,6 @@ CasicIrisRecState::getInstance().noEyeCount = 0; // 持续未找到眼的次数清零 CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FIND_EYE; - // CasicIrisRecState::getInstance().irisInfo->hasEye = irisInfo.hasEye; - // CasicIrisRecState::getInstance().irisInfo->eyeRect = irisInfo.eyeRect; - // CasicIrisRecState::getInstance().irisInfo->matData = irisInfo.matData; - // CasicIrisRecState::getInstance().irisInfo->data = ImageUtil::MatImageToQImage(irisInfo.matData); - - // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); @@ -244,17 +240,39 @@ } void IrisRecogProcess::addOneNoEyeCount() { - CasicIrisRecState::getInstance().noEyeCount++; - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_IDENTIFYING) { - CasicIrisRecState::getInstance().noEyeCount = 0; + CasicIrisRecState::getInstance().noEyeCount++; - this->setWorking(false); - ProMemory::getInstance().irisCam->stopCapture(); - ProMemory::getInstance().clearIrisQueue(); + // 如果在识别中 则超过一定次数后返回识别失败 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + { + // 发送信号识别失败 + emit failedMatchedIris(); - emit failedMatchedIris(); + CasicIrisRecState::getInstance().noEyeCount = 0; + // 识别失败时暂停工作 待返回识别界面时再开始工作和拍图 + this->setWorking(false); + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + } + } else if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_WORKING) + { + CasicIrisRecState::getInstance().noEyeCount++; + + // 如果在工作状态 则超过一定次数后返回待机 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_FACE_NOT_FOUND_COUNT) + { + // 发送信号待机 + emit backToLockScreen(); + + CasicIrisRecState::getInstance().noEyeCount = 0; + + // 待机界面还在拍图和工作 + ProMemory::getInstance().clearIrisQueue(); + } + } else { + // 待机界面 不做处理 等待找到眼 } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index f0bd229..9a3eec6 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -41,6 +41,8 @@ signals: void sendDataToExract(QByteArray data); + void backToLockScreen(); + void startIdentifyIris(); void failedMatchedIris(); void findMatchedIris(QString personId); diff --git a/images/lock.png b/images/lock.png new file mode 100644 index 0000000..6f8e677 --- /dev/null +++ b/images/lock.png Binary files differ diff --git a/resource.qrc b/resource.qrc index 9d964c6..0931777 100644 --- a/resource.qrc +++ b/resource.qrc @@ -8,5 +8,6 @@ images/iconWarn.png images/photo.png images/bg_success.png + images/lock.png diff --git a/utils/SettingConfig.cpp b/utils/SettingConfig.cpp index d420285..4b321c1 100644 --- a/utils/SettingConfig.cpp +++ b/utils/SettingConfig.cpp @@ -20,6 +20,7 @@ IRIS_FRAME_INTERVAL = getProperty("camera", "irisFrameInterval").toInt(); IRIS_DISPLAY_WIDTH = getProperty("camera", "irisDisplayWidth").toInt(); IRIS_DISPLAY_HEIGHT = getProperty("camera", "irisDisplayHeight").toInt(); + LOCK_FRAME_INTERVAL = getProperty("camera", "lockFrameInterval").toInt(); MAX_MATCH_TIME = getProperty("recognize", "maxMatchTime").toInt(); SUCCESS_TIPS_LAST = getProperty("recognize", "successTipsLast").toInt(); @@ -28,10 +29,7 @@ MAX_FACE_NOT_FOUND_COUNT = getProperty("recognize", "maxFaceNotFoundCount").toInt(); MAX_IRIS_TRY_COUNT = getProperty("recognize", "maxIrisTryCount").toInt(); MAX_EYE_NOT_FOUND_COUNT = getProperty("recognize", "maxEyeNotFoundCount").toInt(); - - MAX_CAPTURE_STACK_SIZE = getProperty("stack", "capture").toInt(); - MAX_FOUND_STACK_SIZE = getProperty("stack", "found").toInt(); - MAX_QUALIFIED_STACK_SIZE = getProperty("stack", "qualified").toInt(); + MIN_EYE_SIZE = getProperty("recognize", "minEyeSize").toInt(); LOG_FILE = getProperty("log", "logFile").toString(); LOG_LEVEL = getProperty("log", "logLevel").toString(); diff --git a/AppConstants.h b/AppConstants.h index 296c53f..dd1f6de 100644 --- a/AppConstants.h +++ b/AppConstants.h @@ -6,13 +6,13 @@ public: enum WidgeFrameName { - MAIN_PAGE = 0, // 主页面 - PERSON_LIST_FORM = 1, // 人员列表页面 - ADD_PERSON_FORM = 2, // 添加人员页面 - ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 - ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 - SETTING_FORM = 3, // 设置页面 - RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 +// MAIN_PAGE = 0, // 主页面 +// PERSON_LIST_FORM = 1, // 人员列表页面 +// ADD_PERSON_FORM = 2, // 添加人员页面 +// ADD_PERSON_CAPTURE_FACE = 21, // 添加/编辑人员时进行人脸拍图 +// ADD_PERSON_CAPTURE_IRIS = 22, // 添加/编辑人员时进行虹膜拍图 +// SETTING_FORM = 3, // 设置页面 +// RECOGNIZE_RESULT_FORM = 4, // 识别结果界面 IDENTIFY_FORM = 5, // 识别界面 含识别中 和 识别结果 LOCKSCREEN_FORM = 6 // 锁屏待机界面 }; diff --git a/CasicIrisIdentify.pro b/CasicIrisIdentify.pro index 5e411d7..da314a4 100644 --- a/CasicIrisIdentify.pro +++ b/CasicIrisIdentify.pro @@ -40,8 +40,6 @@ DISTFILES += conf/config.ini -#TRANSLATIONS += CasicIrisIdentify_zh_CN.ts - #INCLUDEPATH += include/spdlog #DEPENDPATH += include/spdlog diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index 39427ee..7fb3e7a 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -13,7 +13,7 @@ ui->wgtIdentifying->setCurrentIndex(0); - ui->labelIdenTips->setText("识 别 中"); + ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } @@ -22,6 +22,11 @@ delete ui; } +void IdentifyForm::updateIdentifyTips(QString tips) +{ + ui->labelIdenTips->setText(tips); +} + void IdentifyForm::drawIrisImageOnFrame(QImage image) { // 只在识别界面才显示画面 @@ -32,7 +37,7 @@ void IdentifyForm::showRecogFailure() { - SpeakerUtil::getInstance().speak("识别失败,请重试"); +// SpeakerUtil::getInstance().speak("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); @@ -43,6 +48,8 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); @@ -50,7 +57,7 @@ void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); +// SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -88,6 +95,8 @@ QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; + ui->labelIdenTips->setText(""); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); diff --git a/IdentifyForm.h b/IdentifyForm.h index 024b240..d2f7931 100644 --- a/IdentifyForm.h +++ b/IdentifyForm.h @@ -19,6 +19,8 @@ IdentifyForm(QWidget *parent = nullptr); ~IdentifyForm(); + void updateIdentifyTips(QString tips); + public slots: void drawIrisImageOnFrame(QImage image); diff --git a/LockScreenForm.cpp b/LockScreenForm.cpp index 58dc54b..2d253e8 100644 --- a/LockScreenForm.cpp +++ b/LockScreenForm.cpp @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) +#endif + #include "LockScreenForm.h" #include "ui_LockScreenForm.h" @@ -12,3 +16,16 @@ { delete ui; } + +void LockScreenForm::showLockScreenTime() +{ + QDateTime now = QDateTime::currentDateTime(); + ui->labelLockHour->setText(now.time().toString("HH")); + ui->labelLockMinute->setText(now.time().toString("mm")); + ui->labelLockDate->setText(now.date().toString("MM月dd日 dddd")); + if (now.time().second() % 2 == 0) { + ui->labelLockSep->hide(); + } else { + ui->labelLockSep->show(); + } +} diff --git a/LockScreenForm.h b/LockScreenForm.h index b5ded48..93aac7d 100644 --- a/LockScreenForm.h +++ b/LockScreenForm.h @@ -1,4 +1,4 @@ -#ifndef LOCKSCREENFORM_H +#ifndef LOCKSCREENFORM_H #define LOCKSCREENFORM_H #include @@ -18,6 +18,9 @@ explicit LockScreenForm(QWidget *parent = nullptr); ~LockScreenForm(); +public slots: + void showLockScreenTime(); + private: Ui::LockScreenForm *ui; }; diff --git a/LockScreenForm.ui b/LockScreenForm.ui index 7f2a6db..d7f40d1 100644 --- a/LockScreenForm.ui +++ b/LockScreenForm.ui @@ -6,40 +6,126 @@ 0 0 - 400 - 300 + 600 + 800 Form - + - 180 - 100 - 54 - 12 + 0 + 300 + 600 + 100 - TextLabel + + + + Qt::AlignHCenter|Qt::AlignTop - + - 180 + 285 160 - 54 - 12 + 30 + 128 + + + + + Microsoft YaHei UI Light + 96 + + + + : + + + Qt::AutoText + + + false + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + 0 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + 320 + 150 + 280 + 150 + + + + + Microsoft YaHei UI Light + 96 + + + + 18 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 275 + 50 + 50 + 50 - TextLabel + + + + :/images/lock.png + + + true + + + Qt::AlignCenter - + + + diff --git a/MainWindowForm.cpp b/MainWindowForm.cpp index 79a320b..9f07bfa 100644 --- a/MainWindowForm.cpp +++ b/MainWindowForm.cpp @@ -28,16 +28,18 @@ file.close(); } + // 初始化虹膜库 + ProMemory::getInstance().initIrisFeatures(); + + // 初始化各个界面的form initFormsPtr(); - initIrisRecogThread(); // 虹膜识别线程 - // 设置标题文字 - ui->labelTitle->setText(SettingConfig::getInstance().WINDOW_TITLE); ui->labelCopyright->setText(SettingConfig::getInstance().WINDOW_RIGHTS); ui->labelVersion->setText(SettingConfig::getInstance().WINDOW_VERSION); - ui->labelDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); + ui->labelMainTime->setText(QTime::currentTime().toString("HH:mm:ss")); + ui->labelMainDate->setText(QDate::currentDate().toString("yyyy-MM-dd dddd")); // 初始化更新界面的定时器 // 每秒执行一次 @@ -52,15 +54,17 @@ // LOG_INFO(QString("应用程序启动成功[Application Startup Success]").toStdString()); qDebug() << QString("应用程序启动成功[Application Startup Success]"); - ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; - ui->wdgtStatced->setCurrentWidget(identifyForm); - ProMemory::getInstance().initIrisFeatures(); + // 启动后显示视频画面 工作状态 未开始识别 + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; // 启动后显示视频画面 + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; // 启动后处于工作状态 + ui->wdgtStatced->setCurrentWidget(identifyForm); // 开始虹膜相机拍图 ProMemory::getInstance().irisCam->startCapture(); // 识别线程开始工作 + initIrisRecogThread(); // 虹膜识别线程 ProMemory::getInstance().irisRecogPro->setWorking(true); } @@ -75,11 +79,36 @@ delete ProMemory::getInstance().irisRecogPro; } -void MainWindowForm::lockScreen() +void MainWindowForm::lockScreenHandler() { ui->wdgtStatced->setCurrentWidget(lockScreenForm); ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::LOCKSCREEN_FORM; - ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WAIT; // App状态 = 待机 + + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().LOCK_FRAME_INTERVAL); + + ui->labelMainTime->hide(); + ui->labelMainDate->hide(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); +} + +void MainWindowForm::startIdentifyHandler() +{ + ui->wdgtStatced->setCurrentWidget(identifyForm); + ProMemory::getInstance().widgeFrame = AppConstants::WidgeFrameName::IDENTIFY_FORM; + ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_IDENTIFYING; // App状态 = 识别中 + identifyForm->updateIdentifyTips("识 别 中"); + TimeCounterUtil::getInstance().irisCapCounter->setInterval(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); + + ui->labelMainTime->show(); + ui->labelMainDate->show(); + + // 重新绑定每秒的定时信号和槽函数 + disconnect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, lockScreenForm, &LockScreenForm::showLockScreenTime); + connect(TimeCounterUtil::getInstance().clockCounter, &QTimer::timeout, this, &MainWindowForm::updateBannerTime); } void MainWindowForm::keyPressEvent(QKeyEvent *event) @@ -120,15 +149,24 @@ // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, identifyForm, &IdentifyForm::showRecogFailure); + // 找到眼睛 开始识别 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::startIdentifyIris, this, &MainWindowForm::startIdentifyHandler); + + // 持续没找到目标 待机 + connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::backToLockScreen, this, &MainWindowForm::lockScreenHandler); + ProMemory::getInstance().irisRecogPro->start(); } void MainWindowForm::updateBannerTime() { QDateTime now = QDateTime::currentDateTime(); - ui->labelTitle->setText(now.toString("HH:mm:ss")); + if (ProMemory::getInstance().widgeFrame == AppConstants::WidgeFrameName::IDENTIFY_FORM) + { + ui->labelMainTime->setText(now.toString("HH:mm:ss")); - if (now.toString("HH:mm:ss") == "00:00:00") { - ui->labelDate->setText(now.toString("yyyy-MM-dd dddd")); + if (now.toString("HH:mm:ss") == "00:00:00") { + ui->labelMainDate->setText(now.toString("yyyy-MM-dd dddd")); + } } } diff --git a/MainWindowForm.h b/MainWindowForm.h index be99e37..1e5d49a 100644 --- a/MainWindowForm.h +++ b/MainWindowForm.h @@ -23,7 +23,8 @@ ~MainWindowForm(); public slots: - void lockScreen(); + void lockScreenHandler(); + void startIdentifyHandler(); private: Ui::MainWindowForm *ui; diff --git a/MainWindowForm.ui b/MainWindowForm.ui index ad8e65c..db44441 100644 --- a/MainWindowForm.ui +++ b/MainWindowForm.ui @@ -31,7 +31,7 @@ - + 0 @@ -40,14 +40,11 @@ 84 - - TextLabel - Qt::AlignBottom|Qt::AlignHCenter - + 0 @@ -57,7 +54,7 @@ - TextLabel + Qt::AlignCenter diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index ff478d1..1558461 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -191,27 +191,6 @@ return irisInfo; } -//CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo irisInfo) -//{ -///* -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); -//*/ -// cv::Mat preMat = irisInfo.matData; - -// // 图像转换为RGB的彩色图像 -// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - -// // 缩放到320 * 240 -// cv::resize(preMat, preMat, cv::Size(320, 240)); -// irisInfo.matData = preMat; - -// std::string filename = QString("%1\\%2\\%3.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); -// cv::imwrite(filename, irisInfo.matData); - -// return irisInfo; -//} - CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index d13b31f..cbee8fe 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,6 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); -// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +41,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.72; + float cutRatio = 0.72f; // 裁剪比率 用于裁剪更大比例的眼部图像 cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 4a313ef..41105e1 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -32,7 +32,6 @@ // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); qDebug() << QString("[CasicIrisRecState][initRecognize][%1] 虹膜识别状态初始化").arg(recoginzeId); - } QString CasicIrisRecState::toString() @@ -55,14 +54,6 @@ QJsonObject eyeObj; eyeObj.insert("hasEye", irisInfo->hasEye); -// QJsonArray rectArray; -// rectArray.append(irisInfo->eyeRect.x); -// rectArray.append(irisInfo->eyeRect.y); -// rectArray.append(irisInfo->eyeRect.width); -// rectArray.append(irisInfo->eyeRect.height); -// eyeObj.insert("faceRect", rectArray); - -// obj.insert("eye", eyeObj); return obj; } diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index f1112f2..7506581 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -35,7 +35,7 @@ QString matchedId; qint8 tryCount = 0; // 识别尝试次数 - qint8 noEyeCount = 0; // 连续没有找到眼睛次数 + qint16 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 /** diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 2ad8c87..5ca377e 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -43,7 +43,7 @@ continue; } - // 图像栈中没有图像则直接返回 + // 1. 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); @@ -51,7 +51,7 @@ continue; } - // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 + // 2. 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); @@ -59,16 +59,14 @@ continue; } - // 取出虹膜图像栈中的一条数据 - // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); + // 3. 取出虹膜图像栈中的一条数据 CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); + // 4. 调用找眼分类器算法 + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(SettingConfig::getInstance().MIN_EYE_SIZE); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); - // irisInfo.hasEye = true; - // 没有找到眼睛则返回 + // 4.1 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 @@ -79,7 +77,11 @@ continue; } - // 找到眼睛则开始质量评估和编码 + // 4.2 找到眼睛则开始识别 + + // 发送信号更新界面 + emit startIdentifyIris(); + // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") { @@ -89,12 +91,6 @@ CasicIrisRecState::getInstance().noEyeCount = 0; // 持续未找到眼的次数清零 CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FIND_EYE; - // CasicIrisRecState::getInstance().irisInfo->hasEye = irisInfo.hasEye; - // CasicIrisRecState::getInstance().irisInfo->eyeRect = irisInfo.eyeRect; - // CasicIrisRecState::getInstance().irisInfo->matData = irisInfo.matData; - // CasicIrisRecState::getInstance().irisInfo->data = ImageUtil::MatImageToQImage(irisInfo.matData); - - // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); @@ -244,17 +240,39 @@ } void IrisRecogProcess::addOneNoEyeCount() { - CasicIrisRecState::getInstance().noEyeCount++; - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_IDENTIFYING) { - CasicIrisRecState::getInstance().noEyeCount = 0; + CasicIrisRecState::getInstance().noEyeCount++; - this->setWorking(false); - ProMemory::getInstance().irisCam->stopCapture(); - ProMemory::getInstance().clearIrisQueue(); + // 如果在识别中 则超过一定次数后返回识别失败 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_EYE_NOT_FOUND_COUNT) + { + // 发送信号识别失败 + emit failedMatchedIris(); - emit failedMatchedIris(); + CasicIrisRecState::getInstance().noEyeCount = 0; + // 识别失败时暂停工作 待返回识别界面时再开始工作和拍图 + this->setWorking(false); + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + } + } else if (ProMemory::getInstance().appState == AppConstants::ApplicationState::STATE_WORKING) + { + CasicIrisRecState::getInstance().noEyeCount++; + + // 如果在工作状态 则超过一定次数后返回待机 + if (CasicIrisRecState::getInstance().noEyeCount >= SettingConfig::getInstance().MAX_FACE_NOT_FOUND_COUNT) + { + // 发送信号待机 + emit backToLockScreen(); + + CasicIrisRecState::getInstance().noEyeCount = 0; + + // 待机界面还在拍图和工作 + ProMemory::getInstance().clearIrisQueue(); + } + } else { + // 待机界面 不做处理 等待找到眼 } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index f0bd229..9a3eec6 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -41,6 +41,8 @@ signals: void sendDataToExract(QByteArray data); + void backToLockScreen(); + void startIdentifyIris(); void failedMatchedIris(); void findMatchedIris(QString personId); diff --git a/images/lock.png b/images/lock.png new file mode 100644 index 0000000..6f8e677 --- /dev/null +++ b/images/lock.png Binary files differ diff --git a/resource.qrc b/resource.qrc index 9d964c6..0931777 100644 --- a/resource.qrc +++ b/resource.qrc @@ -8,5 +8,6 @@ images/iconWarn.png images/photo.png images/bg_success.png + images/lock.png diff --git a/utils/SettingConfig.cpp b/utils/SettingConfig.cpp index d420285..4b321c1 100644 --- a/utils/SettingConfig.cpp +++ b/utils/SettingConfig.cpp @@ -20,6 +20,7 @@ IRIS_FRAME_INTERVAL = getProperty("camera", "irisFrameInterval").toInt(); IRIS_DISPLAY_WIDTH = getProperty("camera", "irisDisplayWidth").toInt(); IRIS_DISPLAY_HEIGHT = getProperty("camera", "irisDisplayHeight").toInt(); + LOCK_FRAME_INTERVAL = getProperty("camera", "lockFrameInterval").toInt(); MAX_MATCH_TIME = getProperty("recognize", "maxMatchTime").toInt(); SUCCESS_TIPS_LAST = getProperty("recognize", "successTipsLast").toInt(); @@ -28,10 +29,7 @@ MAX_FACE_NOT_FOUND_COUNT = getProperty("recognize", "maxFaceNotFoundCount").toInt(); MAX_IRIS_TRY_COUNT = getProperty("recognize", "maxIrisTryCount").toInt(); MAX_EYE_NOT_FOUND_COUNT = getProperty("recognize", "maxEyeNotFoundCount").toInt(); - - MAX_CAPTURE_STACK_SIZE = getProperty("stack", "capture").toInt(); - MAX_FOUND_STACK_SIZE = getProperty("stack", "found").toInt(); - MAX_QUALIFIED_STACK_SIZE = getProperty("stack", "qualified").toInt(); + MIN_EYE_SIZE = getProperty("recognize", "minEyeSize").toInt(); LOG_FILE = getProperty("log", "logFile").toString(); LOG_LEVEL = getProperty("log", "logLevel").toString(); diff --git a/utils/SettingConfig.h b/utils/SettingConfig.h index 30c3bec..852b151 100644 --- a/utils/SettingConfig.h +++ b/utils/SettingConfig.h @@ -40,6 +40,7 @@ int IRIS_HEIGHT; int IRIS_DISPLAY_WIDTH; int IRIS_DISPLAY_HEIGHT; + int LOCK_FRAME_INTERVAL; int MAX_MATCH_TIME; int SUCCESS_TIPS_LAST; @@ -48,10 +49,7 @@ int MAX_FACE_NOT_FOUND_COUNT; int MAX_IRIS_TRY_COUNT; int MAX_EYE_NOT_FOUND_COUNT; - - int MAX_CAPTURE_STACK_SIZE; - int MAX_FOUND_STACK_SIZE; - int MAX_QUALIFIED_STACK_SIZE; + int MIN_EYE_SIZE; QString LOG_FILE; QString LOG_LEVEL;