#ifdef _MSC_VER #pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) #endif #include "IdentifyForm.h" #include "ui_IdentifyForm.h" IdentifyForm::IdentifyForm(QWidget *parent) : QWidget(parent) , ui(new Ui::IdentifyForm) { ui->setupUi(this); ui->wgtIdentifying->setCurrentIndex(0); ui->labelIdenTips->setText(""); ui->labelFailTips->setText("识 别 失 败\n请 重 试"); } IdentifyForm::~IdentifyForm() { delete ui; } void IdentifyForm::updateIdentifyTips(QString tips) { ui->labelIdenTips->setText(tips); } void IdentifyForm::drawIrisImageOnFrame() { // If acquisition did not started if (!ProMemory::getInstance().irisCamCtrl->m_bAcquisitionStart) { return; } // Get Image from image show queue, if image show queue is empty, return directly QImage* qobjImgShow = ProMemory::getInstance().irisCamCtrl->m_pobjAcqThread->PopFrontFromShowImageDeque(); if(qobjImgShow == NULL) { return; } QImage objImgGray = qobjImgShow->convertToFormat(QImage::Format_Grayscale8); // 图像逆时针旋转90度 objImgGray = objImgGray.transformed(QTransform().rotate(SettingConfig::getInstance().DEBUG_CAMERA_ROTATE.toInt())); // 创建虹膜信息对象 CasicIrisInfo irisInfo; irisInfo.hasEye = false; irisInfo.postProcSucc = false; // 存入图像栈 cv::Mat irisMat = ImageUtil::QImageToMat(objImgGray); irisInfo.matData = irisMat; ProMemory::getInstance().pushCasicIris(irisInfo); // Display is finished, push back image buffer to buffer queue ProMemory::getInstance().irisCamCtrl->m_pobjAcqThread->PushBackToEmptyBufferDeque(qobjImgShow); // 只在识别界面才显示画面 if (ui->wgtIdentifying->currentIndex() == 0) { // Display the image QImage imgDisp = objImgGray.scaled(SettingConfig::getInstance().IRIS_DISPLAY_WIDTH, SettingConfig::getInstance().IRIS_DISPLAY_HEIGHT); ui->labelVideo->setPixmap(QPixmap::fromImage(imgDisp)); } return; } void IdentifyForm::showRecogFailure() { SpeakerUtil::getInstance().sayIdentifyFailureZhCn(); LOG_INFO("识别失败,请重试"); ui->wgtIdentifying->setCurrentIndex(2); ProMemory::getInstance().clearIrisQueue(); ProMemory::getInstance().irisRecogPro->setWorking(false); ProMemory::getInstance().irisCamCtrl->stopCapture(); QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCamCtrl->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; ui->labelIdenTips->setText(""); // 清除上一次识别的状态信息 CasicIrisRecState::getInstance().restRecognize(); ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { QVariantMap matched = personDao.findRecordById(personId); QString deptName = matched.value("deptname").toString(); QString personName = matched.value("name").toString(); SpeakerUtil::getInstance().sayIdentifySuccessZhCn(); LOG_INFO(QString("识别成功,%1%2").arg(deptName).arg(personName).toStdString()); ui->wgtIdentifying->setCurrentIndex(1); // 查询并显示人员信息 ui->labelName->setText(""); ui->labelName->setText(personName); ui->labelGender->setText(""); ui->labelGender->setText(CacheManager::getInstance().getGenderName().value(matched.value("gender").toString()).toString()); ui->labelDept->setText(""); ui->labelDept->setText(deptName); ui->labelTs->setText(""); ui->labelTs->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm")); // 查询并显示头像 QPixmap photo; QString photoPath = QString("images/%1").arg(matched.value("avatar").toString()); bool succ = photo.load(photoPath); if (succ == false) { photo.load(":/images/photo.png"); } // 缩放到合适的尺寸 float rp = photo.width() * 1.0 / photo.height() * 1.0; // 图片的比例 float rl = ui->labelPhoto->width() * 1.0 / ui->labelPhoto->height() * 1.0; // 显示框的比例 if (rp <= rl) { // 如果图片的比例小则缩放到显示框的高度 photo = photo.scaledToHeight(ui->labelPhoto->height()); } else { // 如果图片的比例大则缩放到显示框的宽度 photo = photo.scaledToWidth(ui->labelPhoto->width()); } // 显示 ui->labelPhoto->setPixmap(photo); // 执行数据库操作 QVariantMap record; record.insert("person_id", personId); record.insert("date_time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")); record.insert("rec_type", AppConstants::IdentifyType::IRIS); // 虹膜识别; record.insert("dev_code", SettingConfig::getInstance().DEVICE_CODE); record.insert("debug_info", CasicIrisRecState::getInstance().toString()); recordDao.save(record); LOG_INFO("识别成功记录保存成功"); // 返回工作状态和界面 QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCamCtrl->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); ProMemory::getInstance().appState = AppConstants::ApplicationState::STATE_WORKING; ui->labelIdenTips->setText(""); // 清除上一次识别的状态信息 CasicIrisRecState::getInstance().restRecognize(); ui->wgtIdentifying->setCurrentIndex(0); }); }