#include "CasicBioRecWin.h" #include "ui_CasicBioRecWin.h" CasicBioRecWin::CasicBioRecWin(QWidget *parent) : QMainWindow(parent) , ui(new Ui::CasicBioRecWin) { // 打开外部可执行程序 outExe = new QProcess(this); outExe->start(SettingConfig::getInstance().OUT_EXE_FILE); ui->setupUi(this); // 程序启动时初始化缓存的数据 this->initCacheData(); // 设置窗口透明和大小、位置 this->setWindowFlags(Qt::FramelessWindowHint); this->move(0, 0); this->resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); // 通过调色板的颜色来设置窗口的统一背景色 qApp->setPalette(QPalette(QColor(SettingConfig::getInstance().WINDOW_BACKGROUND_COLOR))); // 初始化各个form界面并绑定切换响应函数 initFormsPtr(); // 初始化识别和注册的各个线程 initFaceRegistThread(); // 人脸注册线程 initFaceRecogThread(); // 人脸识别线程 initIrisRegistThread(); // 虹膜注册线程 initIrisRecogThread(); // 虹膜识别线程 initCameraPositionThread(); // 调整相机位置 // 初始化人脸相机控制 ProMemory::getInstance().faceCam = new FaceCameraController(this); ProMemory::getInstance().faceCam->openFaceCamera(1000); connect(ProMemory::getInstance().faceCam, &FaceCameraController::sendImageToDraw, addPersonForm, &AddPersonForm::drawImageOnForm); connect(ProMemory::getInstance().faceCam, &FaceCameraController::sendImageToDrawForRecognize, recogResultForm, &RecognizeResultForm::drawImageOnHomeForm); // 初始化虹膜相机控制 ProMemory::getInstance().irisCam = new IrisCameraController(this); ProMemory::getInstance().irisCam->initIrisCamera(); ProMemory::getInstance().irisCam->openIrisCamera(); connect(ProMemory::getInstance().irisCam->leftHandler, &IrisCameraCapEventHandler::sendIrisFrameToDraw, addPersonForm, &AddPersonForm::drawIrisImageOnFrame); connect(ProMemory::getInstance().irisCam->rightHandler, &IrisCameraCapEventHandler::sendIrisFrameToDraw, addPersonForm, &AddPersonForm::drawIrisImageOnFrame); // 初始化电机控制 ProMemory::getInstance().moto = new MotoController(this); ProMemory::getInstance().moto->initSerialMCU(); connect(ProMemory::getInstance().camPosCtrl, &CameraPositionController::motoControl, ProMemory::getInstance().moto, &MotoController::autoPosition); // 打印日志 //LOG(INFO) << QString("应用程序启动成功[Application Startup Success]").toStdString(); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; } CasicBioRecWin::~CasicBioRecWin() { ProMemory::getInstance().faceRegistPro->exitThread(); ProMemory::getInstance().faceRegistPro->deleteLater(); ProMemory::getInstance().faceRegistPro->wait(); ProMemory::getInstance().faceRecogPro->exitThread(); ProMemory::getInstance().faceRecogPro->deleteLater(); ProMemory::getInstance().faceRecogPro->wait(); ProMemory::getInstance().irisRegistPro->exitThread(); ProMemory::getInstance().irisRegistPro->deleteLater(); ProMemory::getInstance().irisRegistPro->wait(); ProMemory::getInstance().irisRecogPro->exitThread(); ProMemory::getInstance().irisRecogPro->deleteLater(); ProMemory::getInstance().irisRecogPro->wait(); ProMemory::getInstance().camPosCtrl->exitThread(); ProMemory::getInstance().camPosCtrl->deleteLater(); ProMemory::getInstance().camPosCtrl->wait(); // 关闭自动启动的外部程序 outExe->close(); delete outExe; delete ui; delete ProMemory::getInstance().faceRegistPro; delete ProMemory::getInstance().faceRecogPro; delete ProMemory::getInstance().irisRegistPro; delete ProMemory::getInstance().irisRecogPro; delete ProMemory::getInstance().camPosCtrl; } void CasicBioRecWin::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Escape: //LOG(INFO) << "" << std::endl; QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); } } void CasicBioRecWin::backToStandByForm() { ui->stacked->setCurrentWidget(startForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE; ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT; } void CasicBioRecWin::switchToUserListForm() { personListForm->findPersonList(); ui->stacked->setCurrentWidget(personListForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::PERSON_LIST_FORM; } void CasicBioRecWin::switchToSettingForm() { ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::SETTING_FORM; } void CasicBioRecWin::switchToRegistForm(QString personId) { // 根据传递的参数更新页面标题 if (personId.isEmpty() == false) { addPersonForm->setPersonId(personId); addPersonForm->updateFormTitle("人员信息"); // 查询人员信息 addPersonForm->loadPersonInfo(personId); } else { addPersonForm->updateFormTitle("人员注册"); addPersonForm->clearPersonInfo(); addPersonForm->setPersonId(""); } // 切换页面 ui->stacked->setCurrentWidget(addPersonForm); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::ADD_PERSON_FORM; } void CasicBioRecWin::switchToRecognizeForm() { ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::RECOGNIZE_RESULT_FORM; ui->stacked->setCurrentWidget(recogResultForm); recogResultForm->startWorkingRecognize(); } void CasicBioRecWin::initFormsPtr() { startForm = new StartupForm(this); personListForm = new PersonListForm(this); settingForm = new SettingForm(this); addPersonForm = new AddPersonForm(this); recogResultForm = new RecognizeResultForm(this); ui->stacked->addWidget(startForm); ui->stacked->addWidget(personListForm); ui->stacked->addWidget(settingForm); ui->stacked->addWidget(addPersonForm); ui->stacked->addWidget(recogResultForm); // 绑定按钮函数 connect(startForm, &StartupForm::switchToUserListForm, this, &CasicBioRecWin::switchToUserListForm); connect(startForm, &StartupForm::switchToSettingForm, this, &CasicBioRecWin::switchToSettingForm); connect(startForm, &StartupForm::startRecognize, this, &CasicBioRecWin::switchToRecognizeForm); connect(personListForm, &PersonListForm::switchToRegistForm, this, &CasicBioRecWin::switchToRegistForm); connect(personListForm, &PersonListForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); connect(addPersonForm, &AddPersonForm::switchToUserListForm, this, &CasicBioRecWin::switchToUserListForm); connect(addPersonForm, &AddPersonForm::backToHomePage, this, &CasicBioRecWin::backToStandByForm); connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait, this, &CasicBioRecWin::backToStandByForm); } void CasicBioRecWin::initCacheData() { CacheManager::getInstance().updateDeptCache(); } void CasicBioRecWin::initFaceRegistThread() { // 人脸注册处理过程 ProMemory::getInstance().faceRegistPro = new FaceRegistProcess(this); // 绑定信号与槽函数 // 采集人脸图像失败 connect(ProMemory::getInstance().faceRegistPro, &FaceRegistProcess::failedCaptureFace, addPersonForm, &AddPersonForm::onFailedCaptureFace); // 采集人脸图像成功 connect(ProMemory::getInstance().faceRegistPro, &FaceRegistProcess::successCaptureFace, addPersonForm, &AddPersonForm::onSuccessCaptureFace); ProMemory::getInstance().faceRegistPro->start(); } void CasicBioRecWin::initFaceRecogThread() { // 人脸识别处理过程 ProMemory::getInstance().faceRecogPro = new FaceRecogProcess(this); // 绑定信号与槽函数 // 识别成功 connect(ProMemory::getInstance().faceRecogPro, &FaceRecogProcess::matchSuccess, recogResultForm, &RecognizeResultForm::checkRecognizeResult); // 识别失败 connect(ProMemory::getInstance().faceRecogPro, &FaceRecogProcess::matchFailure, recogResultForm, &RecognizeResultForm::showRecogFailure); ProMemory::getInstance().faceRecogPro->start(); } void CasicBioRecWin::initIrisRegistThread() { // 虹膜注册处理过程 ProMemory::getInstance().irisRegistPro = new IrisRegistProcess(this); // 绑定信号与槽函数 // 没有找到匹配的虹膜 采集成功 connect(ProMemory::getInstance().irisRegistPro, &IrisRegistProcess::findNoSimIris, addPersonForm, &AddPersonForm::onSuccessCaptureIrisWithoutMatch); // 采集虹膜失败 connect(ProMemory::getInstance().irisRegistPro, &IrisRegistProcess::captureIrisFailure, addPersonForm, &AddPersonForm::onFailedCaptureIris); // 采集虹膜图像成功 有匹配到虹膜库 connect(ProMemory::getInstance().irisRegistPro, &IrisRegistProcess::findMatchedIris, addPersonForm, &AddPersonForm::onMatchedIris); ProMemory::getInstance().irisRegistPro->start(); } void CasicBioRecWin::initIrisRecogThread() { // 虹膜识别处理过程 ProMemory::getInstance().irisRecogPro = new IrisRecogProcess(this); // 绑定信号与槽函数 // 识别成功 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::findMatchedIris, recogResultForm, &RecognizeResultForm::checkRecognizeResult); // 识别失败 connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris, recogResultForm, &RecognizeResultForm::showRecogFailure); ProMemory::getInstance().irisRecogPro->start(); } void CasicBioRecWin::initCameraPositionThread() { // 调整相机位置处理 ProMemory::getInstance().camPosCtrl = new CameraPositionController(this); // 绑定信号与槽函数 connect(ProMemory::getInstance().camPosCtrl, &CameraPositionController::updateTips, recogResultForm, &RecognizeResultForm::updateRecogTips); connect(ProMemory::getInstance().camPosCtrl, &CameraPositionController::updateTipsBackgroundColor, recogResultForm, &RecognizeResultForm::updateRecogTipsColor); ProMemory::getInstance().camPosCtrl->start(); }