diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 6d2553e..4a313ef 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -27,6 +27,7 @@ this->timeStamp = now.toMSecsSinceEpoch(); this->tryCount = 0; this->noEyeCount = 0; + this->matchedId = ""; // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 6d2553e..4a313ef 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -27,6 +27,7 @@ this->timeStamp = now.toMSecsSinceEpoch(); this->tryCount = 0; this->noEyeCount = 0; + this->matchedId = ""; // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index eea5ddf..f1112f2 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -32,6 +32,8 @@ CasicIrisInfo * irisInfo; + QString matchedId; + qint8 tryCount = 0; // 识别尝试次数 qint8 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 6d2553e..4a313ef 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -27,6 +27,7 @@ this->timeStamp = now.toMSecsSinceEpoch(); this->tryCount = 0; this->noEyeCount = 0; + this->matchedId = ""; // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index eea5ddf..f1112f2 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -32,6 +32,8 @@ CasicIrisInfo * irisInfo; + QString matchedId; + qint8 tryCount = 0; // 识别尝试次数 qint8 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 08c8227..2ad8c87 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -2,7 +2,6 @@ #pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) #endif - #include "IrisRecogProcess.h" IrisRecogProcess::IrisRecogProcess(QObject *parent) : QThread(parent) @@ -40,57 +39,46 @@ // 如果工作标志位为否, 则跳出 if (this->working == false) { - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { -// LOG(TRACE) << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString(); -// LOG_TRACE(QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString()); qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { -// LOG(DEBUG) << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state).toStdString(); - qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 取出虹膜图像栈中的一条数据 + // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); -// LOG(DEBUG) << QString("[IrisRecogProcess] 取出虹膜图像").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 取出虹膜图像").toStdString()); - qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(200); + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); + // irisInfo.hasEye = true; // 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 -// LOG(DEBUG) << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString()); qDebug() << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount); addOneNoEyeCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } -// LOG(DEBUG) << QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString()); - // 找到眼睛则开始质量评估和编码 // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") @@ -101,20 +89,30 @@ 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); + // 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\\photo\\left.bmp", 0); + // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); - // 进行预处理 如图像 - irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + // 进行预处理 转换成 320 * 240 的三通道图像 送去压缩 + cv::Mat segMat; - QByteArray data((char*)irisInfo.matData.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); + // 图像转换为RGB的彩色图像 + cv::cvtColor(irisInfo.matData, segMat, cv::COLOR_GRAY2RGB); + + // 缩放到320 * 240 + cv::resize(segMat, segMat, cv::Size(SettingConfig::getInstance().IRIS_WIDTH * 0.5, SettingConfig::getInstance().IRIS_HEIGHT * 0.5)); + + // std::string filename = QString("%1\\%2\\%3-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); + // cv::imwrite(filename, segMat); + // irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + + QByteArray data((char*)segMat.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); // 发送TCP消息去匹配 emit sendDataToExract(data); @@ -126,6 +124,13 @@ connect(clientUtil, &SocketClientUtil::responseReaded, &loop, &QEventLoop::quit); loop.exec(); + if (clientUtil->getResponse().size() < SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3) { + addOneTryCount(); + qDebug() << QString("算法分割图像失败,暂停200ms[%1 ms]").arg(timer.elapsed()); + this->msleep(THREAD_MSLEEP); // 200ms后再判断 + continue; + } + char recvPupil[320 * 240 * 1]; char recvMask[320 * 240 * 1]; char recvIris[320 * 240 * 1]; @@ -141,13 +146,16 @@ recvIris[i - 2 * 320 * 240] = clientUtil->getResponse().at(i); } + // 成功接收后清除缓存区 + clientUtil->resetRecvBuffer(); + cv::Mat pupil(240, 320, CV_8UC1, recvPupil); cv::Mat mask(240, 320, CV_8UC1, recvMask); cv::Mat iris(240, 320, CV_8UC1, recvIris); irisInfo.segResult.innerMask = pupil; irisInfo.segResult.irisMask = mask; irisInfo.segResult.outerCircle = iris; -/* + /* std::string pupilSeg = QString("%1\\%2\\%3-pupil-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskSeg = QString("%1\\%2\\%3-mask-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string irisSeg = QString("%1\\%2\\%3-iris-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); @@ -158,12 +166,12 @@ qDebug() << QString("算法分割图像成功[%1 ms]").arg(timer.elapsed()); // 分割后的后处理 - if(cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) + if (cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) { qDebug() << "算法分割图像失败,暂停200ms"; addOneTryCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } @@ -171,14 +179,13 @@ CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT; timer.restart(); - qDebug() << "开始提取特征"; irisInfo = casic::iris::CasicIrisInterface::getInstance().irisEncode(irisInfo); -/* + std::string codeFilename = QString("%1\\%2\\%3-code.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskFilename = QString("%1\\%2\\%3-mask.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); cv::imwrite(codeFilename, irisInfo.irisCode); cv::imwrite(maskFilename, irisInfo.maskNorm); -*/ + qDebug() << QString("虹膜图像编码成功[%1 ms]").arg(timer.elapsed()); // 开始匹配 @@ -186,63 +193,26 @@ { CasicIrisFeature feature = ProMemory::getInstance().getIrisFeatures().at(i); float score = casic::iris::CasicIrisInterface::getInstance().calculateMatchScore(feature, irisInfo); - qDebug() << score; + // SpeakerUtil::getInstance().speak(QString::number(score)); + cv::imwrite(QString("%1\\%2\\%3-%4.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).arg(score).toStdString(), irisInfo.matData); if (score <= 0.32) { - // 找到匹配结果 - emit findMatchedIris(feature.personId); - - break; + CasicIrisRecState::getInstance().state = CasicIrisRecState::REC_SEARCH_SUCC; + CasicIrisRecState::getInstance().matchedId = feature.personId; + break ; } } - // 没有匹配上 - addOneTryCount(); + if (CasicIrisRecState::getInstance().state == CasicIrisRecState::REC_SEARCH_SUCC) { + // 找到匹配结果 + emit findMatchedIris(CasicIrisRecState::getInstance().matchedId); -// QByteArray matchResponse; -// LOG(INFO) << QString("算法匹配结果").toStdString() << matchResponse.toStdString(); -// LOG_INFO("算法匹配结果 {}",matchResponse.toStdString()); -/* - // 算法调用返回成功 - if (matchResponse.size() > 0) - { - QString response = matchResponse.mid(5, matchResponse.size() - 6); - QStringList messList = response.split(";"); - QString code = messList.at(0); - if (code.toInt() == 0) - { - QString personId = messList.at(1); - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_SEARCH_SUCC; - -// LOG(INFO) << QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString(); -// LOG_INFO(QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString()); - - // 保存图像文件 -// cv::imwrite(QString("D:\\irisLogs\\%1-%2.bmp").arg(QDateTime::currentDateTime().toString("HHmmsszzz")).arg(irisInfo.leftOrRight).toStdString(), irisInfo.matData); - - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - emit findMatchedIris(personId); - this->afterRecogAction(); - } else if (code.toInt() == -200) - { - // 匹配失败 -// LOG(INFO) << QString("匹配失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("匹配失败: {}", matchResponse.toStdString()); - - // 匹配失败则尝试次数+1 - addOneTryCount(); - } else if (code.toInt() == -100) - { - // 编码失败 -// LOG(INFO) << QString("编码失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("编码失败: {}", matchResponse.toStdString()); - // 编码失败则尝试次数+1 - addOneTryCount(); - } - } else - { - // 超时返回则尝试次数+1 + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + this->setWorking(false); + } else { + // 没有匹配上 addOneTryCount(); - }*/ + } } } @@ -266,8 +236,9 @@ CasicIrisRecState::getInstance().tryCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); + emit failedMatchedIris(); } } @@ -280,14 +251,10 @@ CasicIrisRecState::getInstance().noEyeCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); -// if (qrand() % 10 < 5) { - emit failedMatchedIris(); -// } -// else { -// emit findMatchedIris("1"); -// } + emit failedMatchedIris(); + } } diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 6d2553e..4a313ef 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -27,6 +27,7 @@ this->timeStamp = now.toMSecsSinceEpoch(); this->tryCount = 0; this->noEyeCount = 0; + this->matchedId = ""; // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index eea5ddf..f1112f2 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -32,6 +32,8 @@ CasicIrisInfo * irisInfo; + QString matchedId; + qint8 tryCount = 0; // 识别尝试次数 qint8 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 08c8227..2ad8c87 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -2,7 +2,6 @@ #pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) #endif - #include "IrisRecogProcess.h" IrisRecogProcess::IrisRecogProcess(QObject *parent) : QThread(parent) @@ -40,57 +39,46 @@ // 如果工作标志位为否, 则跳出 if (this->working == false) { - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { -// LOG(TRACE) << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString(); -// LOG_TRACE(QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString()); qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { -// LOG(DEBUG) << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state).toStdString(); - qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 取出虹膜图像栈中的一条数据 + // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); -// LOG(DEBUG) << QString("[IrisRecogProcess] 取出虹膜图像").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 取出虹膜图像").toStdString()); - qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(200); + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); + // irisInfo.hasEye = true; // 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 -// LOG(DEBUG) << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString()); qDebug() << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount); addOneNoEyeCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } -// LOG(DEBUG) << QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString()); - // 找到眼睛则开始质量评估和编码 // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") @@ -101,20 +89,30 @@ 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); + // 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\\photo\\left.bmp", 0); + // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); - // 进行预处理 如图像 - irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + // 进行预处理 转换成 320 * 240 的三通道图像 送去压缩 + cv::Mat segMat; - QByteArray data((char*)irisInfo.matData.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); + // 图像转换为RGB的彩色图像 + cv::cvtColor(irisInfo.matData, segMat, cv::COLOR_GRAY2RGB); + + // 缩放到320 * 240 + cv::resize(segMat, segMat, cv::Size(SettingConfig::getInstance().IRIS_WIDTH * 0.5, SettingConfig::getInstance().IRIS_HEIGHT * 0.5)); + + // std::string filename = QString("%1\\%2\\%3-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); + // cv::imwrite(filename, segMat); + // irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + + QByteArray data((char*)segMat.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); // 发送TCP消息去匹配 emit sendDataToExract(data); @@ -126,6 +124,13 @@ connect(clientUtil, &SocketClientUtil::responseReaded, &loop, &QEventLoop::quit); loop.exec(); + if (clientUtil->getResponse().size() < SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3) { + addOneTryCount(); + qDebug() << QString("算法分割图像失败,暂停200ms[%1 ms]").arg(timer.elapsed()); + this->msleep(THREAD_MSLEEP); // 200ms后再判断 + continue; + } + char recvPupil[320 * 240 * 1]; char recvMask[320 * 240 * 1]; char recvIris[320 * 240 * 1]; @@ -141,13 +146,16 @@ recvIris[i - 2 * 320 * 240] = clientUtil->getResponse().at(i); } + // 成功接收后清除缓存区 + clientUtil->resetRecvBuffer(); + cv::Mat pupil(240, 320, CV_8UC1, recvPupil); cv::Mat mask(240, 320, CV_8UC1, recvMask); cv::Mat iris(240, 320, CV_8UC1, recvIris); irisInfo.segResult.innerMask = pupil; irisInfo.segResult.irisMask = mask; irisInfo.segResult.outerCircle = iris; -/* + /* std::string pupilSeg = QString("%1\\%2\\%3-pupil-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskSeg = QString("%1\\%2\\%3-mask-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string irisSeg = QString("%1\\%2\\%3-iris-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); @@ -158,12 +166,12 @@ qDebug() << QString("算法分割图像成功[%1 ms]").arg(timer.elapsed()); // 分割后的后处理 - if(cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) + if (cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) { qDebug() << "算法分割图像失败,暂停200ms"; addOneTryCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } @@ -171,14 +179,13 @@ CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT; timer.restart(); - qDebug() << "开始提取特征"; irisInfo = casic::iris::CasicIrisInterface::getInstance().irisEncode(irisInfo); -/* + std::string codeFilename = QString("%1\\%2\\%3-code.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskFilename = QString("%1\\%2\\%3-mask.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); cv::imwrite(codeFilename, irisInfo.irisCode); cv::imwrite(maskFilename, irisInfo.maskNorm); -*/ + qDebug() << QString("虹膜图像编码成功[%1 ms]").arg(timer.elapsed()); // 开始匹配 @@ -186,63 +193,26 @@ { CasicIrisFeature feature = ProMemory::getInstance().getIrisFeatures().at(i); float score = casic::iris::CasicIrisInterface::getInstance().calculateMatchScore(feature, irisInfo); - qDebug() << score; + // SpeakerUtil::getInstance().speak(QString::number(score)); + cv::imwrite(QString("%1\\%2\\%3-%4.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).arg(score).toStdString(), irisInfo.matData); if (score <= 0.32) { - // 找到匹配结果 - emit findMatchedIris(feature.personId); - - break; + CasicIrisRecState::getInstance().state = CasicIrisRecState::REC_SEARCH_SUCC; + CasicIrisRecState::getInstance().matchedId = feature.personId; + break ; } } - // 没有匹配上 - addOneTryCount(); + if (CasicIrisRecState::getInstance().state == CasicIrisRecState::REC_SEARCH_SUCC) { + // 找到匹配结果 + emit findMatchedIris(CasicIrisRecState::getInstance().matchedId); -// QByteArray matchResponse; -// LOG(INFO) << QString("算法匹配结果").toStdString() << matchResponse.toStdString(); -// LOG_INFO("算法匹配结果 {}",matchResponse.toStdString()); -/* - // 算法调用返回成功 - if (matchResponse.size() > 0) - { - QString response = matchResponse.mid(5, matchResponse.size() - 6); - QStringList messList = response.split(";"); - QString code = messList.at(0); - if (code.toInt() == 0) - { - QString personId = messList.at(1); - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_SEARCH_SUCC; - -// LOG(INFO) << QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString(); -// LOG_INFO(QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString()); - - // 保存图像文件 -// cv::imwrite(QString("D:\\irisLogs\\%1-%2.bmp").arg(QDateTime::currentDateTime().toString("HHmmsszzz")).arg(irisInfo.leftOrRight).toStdString(), irisInfo.matData); - - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - emit findMatchedIris(personId); - this->afterRecogAction(); - } else if (code.toInt() == -200) - { - // 匹配失败 -// LOG(INFO) << QString("匹配失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("匹配失败: {}", matchResponse.toStdString()); - - // 匹配失败则尝试次数+1 - addOneTryCount(); - } else if (code.toInt() == -100) - { - // 编码失败 -// LOG(INFO) << QString("编码失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("编码失败: {}", matchResponse.toStdString()); - // 编码失败则尝试次数+1 - addOneTryCount(); - } - } else - { - // 超时返回则尝试次数+1 + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + this->setWorking(false); + } else { + // 没有匹配上 addOneTryCount(); - }*/ + } } } @@ -266,8 +236,9 @@ CasicIrisRecState::getInstance().tryCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); + emit failedMatchedIris(); } } @@ -280,14 +251,10 @@ CasicIrisRecState::getInstance().noEyeCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); -// if (qrand() % 10 < 5) { - emit failedMatchedIris(); -// } -// else { -// emit findMatchedIris("1"); -// } + emit failedMatchedIris(); + } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index 76ef115..f0bd229 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -1,6 +1,8 @@ #ifndef IRISRECOGPROCESS_H #define IRISRECOGPROCESS_H +#define THREAD_MSLEEP 200 + #include #include #include diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 6d2553e..4a313ef 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -27,6 +27,7 @@ this->timeStamp = now.toMSecsSinceEpoch(); this->tryCount = 0; this->noEyeCount = 0; + this->matchedId = ""; // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index eea5ddf..f1112f2 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -32,6 +32,8 @@ CasicIrisInfo * irisInfo; + QString matchedId; + qint8 tryCount = 0; // 识别尝试次数 qint8 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 08c8227..2ad8c87 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -2,7 +2,6 @@ #pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) #endif - #include "IrisRecogProcess.h" IrisRecogProcess::IrisRecogProcess(QObject *parent) : QThread(parent) @@ -40,57 +39,46 @@ // 如果工作标志位为否, 则跳出 if (this->working == false) { - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { -// LOG(TRACE) << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString(); -// LOG_TRACE(QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString()); qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { -// LOG(DEBUG) << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state).toStdString(); - qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 取出虹膜图像栈中的一条数据 + // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); -// LOG(DEBUG) << QString("[IrisRecogProcess] 取出虹膜图像").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 取出虹膜图像").toStdString()); - qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(200); + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); + // irisInfo.hasEye = true; // 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 -// LOG(DEBUG) << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString()); qDebug() << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount); addOneNoEyeCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } -// LOG(DEBUG) << QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString()); - // 找到眼睛则开始质量评估和编码 // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") @@ -101,20 +89,30 @@ 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); + // 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\\photo\\left.bmp", 0); + // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); - // 进行预处理 如图像 - irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + // 进行预处理 转换成 320 * 240 的三通道图像 送去压缩 + cv::Mat segMat; - QByteArray data((char*)irisInfo.matData.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); + // 图像转换为RGB的彩色图像 + cv::cvtColor(irisInfo.matData, segMat, cv::COLOR_GRAY2RGB); + + // 缩放到320 * 240 + cv::resize(segMat, segMat, cv::Size(SettingConfig::getInstance().IRIS_WIDTH * 0.5, SettingConfig::getInstance().IRIS_HEIGHT * 0.5)); + + // std::string filename = QString("%1\\%2\\%3-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); + // cv::imwrite(filename, segMat); + // irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + + QByteArray data((char*)segMat.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); // 发送TCP消息去匹配 emit sendDataToExract(data); @@ -126,6 +124,13 @@ connect(clientUtil, &SocketClientUtil::responseReaded, &loop, &QEventLoop::quit); loop.exec(); + if (clientUtil->getResponse().size() < SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3) { + addOneTryCount(); + qDebug() << QString("算法分割图像失败,暂停200ms[%1 ms]").arg(timer.elapsed()); + this->msleep(THREAD_MSLEEP); // 200ms后再判断 + continue; + } + char recvPupil[320 * 240 * 1]; char recvMask[320 * 240 * 1]; char recvIris[320 * 240 * 1]; @@ -141,13 +146,16 @@ recvIris[i - 2 * 320 * 240] = clientUtil->getResponse().at(i); } + // 成功接收后清除缓存区 + clientUtil->resetRecvBuffer(); + cv::Mat pupil(240, 320, CV_8UC1, recvPupil); cv::Mat mask(240, 320, CV_8UC1, recvMask); cv::Mat iris(240, 320, CV_8UC1, recvIris); irisInfo.segResult.innerMask = pupil; irisInfo.segResult.irisMask = mask; irisInfo.segResult.outerCircle = iris; -/* + /* std::string pupilSeg = QString("%1\\%2\\%3-pupil-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskSeg = QString("%1\\%2\\%3-mask-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string irisSeg = QString("%1\\%2\\%3-iris-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); @@ -158,12 +166,12 @@ qDebug() << QString("算法分割图像成功[%1 ms]").arg(timer.elapsed()); // 分割后的后处理 - if(cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) + if (cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) { qDebug() << "算法分割图像失败,暂停200ms"; addOneTryCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } @@ -171,14 +179,13 @@ CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT; timer.restart(); - qDebug() << "开始提取特征"; irisInfo = casic::iris::CasicIrisInterface::getInstance().irisEncode(irisInfo); -/* + std::string codeFilename = QString("%1\\%2\\%3-code.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskFilename = QString("%1\\%2\\%3-mask.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); cv::imwrite(codeFilename, irisInfo.irisCode); cv::imwrite(maskFilename, irisInfo.maskNorm); -*/ + qDebug() << QString("虹膜图像编码成功[%1 ms]").arg(timer.elapsed()); // 开始匹配 @@ -186,63 +193,26 @@ { CasicIrisFeature feature = ProMemory::getInstance().getIrisFeatures().at(i); float score = casic::iris::CasicIrisInterface::getInstance().calculateMatchScore(feature, irisInfo); - qDebug() << score; + // SpeakerUtil::getInstance().speak(QString::number(score)); + cv::imwrite(QString("%1\\%2\\%3-%4.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).arg(score).toStdString(), irisInfo.matData); if (score <= 0.32) { - // 找到匹配结果 - emit findMatchedIris(feature.personId); - - break; + CasicIrisRecState::getInstance().state = CasicIrisRecState::REC_SEARCH_SUCC; + CasicIrisRecState::getInstance().matchedId = feature.personId; + break ; } } - // 没有匹配上 - addOneTryCount(); + if (CasicIrisRecState::getInstance().state == CasicIrisRecState::REC_SEARCH_SUCC) { + // 找到匹配结果 + emit findMatchedIris(CasicIrisRecState::getInstance().matchedId); -// QByteArray matchResponse; -// LOG(INFO) << QString("算法匹配结果").toStdString() << matchResponse.toStdString(); -// LOG_INFO("算法匹配结果 {}",matchResponse.toStdString()); -/* - // 算法调用返回成功 - if (matchResponse.size() > 0) - { - QString response = matchResponse.mid(5, matchResponse.size() - 6); - QStringList messList = response.split(";"); - QString code = messList.at(0); - if (code.toInt() == 0) - { - QString personId = messList.at(1); - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_SEARCH_SUCC; - -// LOG(INFO) << QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString(); -// LOG_INFO(QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString()); - - // 保存图像文件 -// cv::imwrite(QString("D:\\irisLogs\\%1-%2.bmp").arg(QDateTime::currentDateTime().toString("HHmmsszzz")).arg(irisInfo.leftOrRight).toStdString(), irisInfo.matData); - - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - emit findMatchedIris(personId); - this->afterRecogAction(); - } else if (code.toInt() == -200) - { - // 匹配失败 -// LOG(INFO) << QString("匹配失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("匹配失败: {}", matchResponse.toStdString()); - - // 匹配失败则尝试次数+1 - addOneTryCount(); - } else if (code.toInt() == -100) - { - // 编码失败 -// LOG(INFO) << QString("编码失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("编码失败: {}", matchResponse.toStdString()); - // 编码失败则尝试次数+1 - addOneTryCount(); - } - } else - { - // 超时返回则尝试次数+1 + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + this->setWorking(false); + } else { + // 没有匹配上 addOneTryCount(); - }*/ + } } } @@ -266,8 +236,9 @@ CasicIrisRecState::getInstance().tryCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); + emit failedMatchedIris(); } } @@ -280,14 +251,10 @@ CasicIrisRecState::getInstance().noEyeCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); -// if (qrand() % 10 < 5) { - emit failedMatchedIris(); -// } -// else { -// emit findMatchedIris("1"); -// } + emit failedMatchedIris(); + } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index 76ef115..f0bd229 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -1,6 +1,8 @@ #ifndef IRISRECOGPROCESS_H #define IRISRECOGPROCESS_H +#define THREAD_MSLEEP 200 + #include #include #include diff --git a/utils/SocketClientUtil.cpp b/utils/SocketClientUtil.cpp index d4e9c5c..d539d64 100644 --- a/utils/SocketClientUtil.cpp +++ b/utils/SocketClientUtil.cpp @@ -24,6 +24,12 @@ return this->response; } +void SocketClientUtil::resetRecvBuffer() +{ + response.clear(); + response.resize(0); +} + void SocketClientUtil::sendData(QByteArray data) { // data.append(0x0D).append(0x0A); // 自动加\r\n标识一帧结束 diff --git a/IdentifyForm.cpp b/IdentifyForm.cpp index a165cda..39427ee 100644 --- a/IdentifyForm.cpp +++ b/IdentifyForm.cpp @@ -43,13 +43,14 @@ QTimer::singleShot(SettingConfig::getInstance().FAILURE_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } void IdentifyForm::showRecognizeResult(QString personId) { - SpeakerUtil::getInstance().speak("识别成功,项目部王珏"); + SpeakerUtil::getInstance().speak(QString("识别成功,项目部王珏%1").arg(personId)); ui->wgtIdentifying->setCurrentIndex(1); @@ -84,25 +85,10 @@ ui->labelPhoto->setPixmap(p); -// FaceDataImgDao faceImgDao; -// QVariantMap photoImage = faceImgDao.findRecordByPersonId(personId); -// if (photoImage.isEmpty() == false) -// { -// QString imageData = photoImage.find("face_image")->toString(); -// QImage image; -// image.loadFromData(QByteArray::fromBase64(imageData.toLatin1())); -// image = image.scaledToHeight(280, Qt::SmoothTransformation); -// ui->labPhoto->setPixmap(QPixmap::fromImage(image)); -// } else { -// ui->labPhoto->setPixmap(QPixmap(":/images/photoFace.png")); -// } - -// ui->widgetSucc->raise(); -// ui->widgetSucc->show(); - QTimer::singleShot(SettingConfig::getInstance().SUCCESS_TIPS_LAST, [=](){ ProMemory::getInstance().irisCam->startCapture(); ProMemory::getInstance().irisRecogPro->setWorking(true); + CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; ui->wgtIdentifying->setCurrentIndex(0); }); } diff --git a/ProMemory.cpp b/ProMemory.cpp index 43cb6a0..f82aed4 100644 --- a/ProMemory.cpp +++ b/ProMemory.cpp @@ -14,7 +14,7 @@ { QMutex mutex; mutex.lock(); - if (this->irisQueue.size() > 30) + if (this->irisQueue.size() > 10) { QStack empty; std::swap(empty, irisQueue); @@ -81,8 +81,8 @@ CasicIrisFeature leftFeature; leftFeature.irisId = 1; leftFeature.personId = "11"; - leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\184300-code.bmp", 0); - leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\184300-mask.bmp", 0); + leftFeature.irisCode = cv::imread("d:\\irisLogs\\photo\\left-code.bmp", 0); + leftFeature.maskNorm = cv::imread("d:\\irisLogs\\photo\\left-mask.bmp", 0); /* CasicIrisFeature rightFeature; rightFeature.irisId = 2; diff --git a/casic/iris/CasicIrisInfo.h b/casic/iris/CasicIrisInfo.h index 6b8b1ee..3cc5773 100644 --- a/casic/iris/CasicIrisInfo.h +++ b/casic/iris/CasicIrisInfo.h @@ -13,7 +13,7 @@ // 眼部图像 // 后续计算需要使用 // QImage data; - cv::Mat matData; + cv::Mat matData; // 原始图像 找到眼睛之后裁剪成640 * 480的灰度图 cv::Mat maskNorm; cv::Mat irisCode; diff --git a/casic/iris/CasicIrisInterface.cpp b/casic/iris/CasicIrisInterface.cpp index 7f1d635..ff478d1 100644 --- a/casic/iris/CasicIrisInterface.cpp +++ b/casic/iris/CasicIrisInterface.cpp @@ -150,8 +150,6 @@ cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 -// cv::imwrite(QString("d:\\irisLogs\\%1.bmp").arg(QDateTime::currentSecsSinceEpoch()).toStdString(), halfSize); - irisInfo.hasEye = true; // irisInfo.eyeRect = rect.at(0); @@ -193,38 +191,43 @@ return irisInfo; } -CasicIrisInfo casic::iris::CasicIrisInterface::irisPreProcess(CasicIrisInfo 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; - 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); +// // 图像转换为RGB的彩色图像 +// cv::cvtColor(preMat, preMat, cv::COLOR_GRAY2RGB); - 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; +// // 缩放到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; -} +// return irisInfo; +//} CasicIrisInfo casic::iris::CasicIrisInterface::irisEncode(CasicIrisInfo irisInfo) { std::vector irisCircle, pupilCircle; // x,y,r iristrt::CasicSegPostProcess segPost; + + cv::resize(irisInfo.segResult.irisMask, irisInfo.segResult.irisMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.innerMask, irisInfo.segResult.innerMask, cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + cv::resize(irisInfo.segResult.outerCircle, irisInfo.segResult.outerCircle,cv::Size(irisInfo.matData.cols, irisInfo.matData.rows)); + bool flag = segPost.postProcess(irisInfo.segResult.irisMask, irisInfo.segResult.outerCircle, irisInfo.segResult.innerMask, irisCircle, pupilCircle); if(!flag || irisCircle.size() <= 0 || pupilCircle.size() <= 0) { return irisInfo; } - // std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; +// std::cout << "finish postProcess " << irisCircle[0] << " " << irisCircle[1] << " " << irisCircle[2] << " " << pupilCircle[0] << " " << pupilCircle[1] << " " << pupilCircle[2] << std::endl; int iris_x = irisCircle[0]; int iris_y = irisCircle[1]; int iris_r = irisCircle[2]; @@ -249,5 +252,7 @@ float casic::iris::CasicIrisInterface::calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo) { +// cv::imshow("info", irisInfo.irisCode); +// cv::waitKey(0); return rec.matchImage(feature.irisCode, irisInfo.irisCode, feature.maskNorm, irisInfo.maskNorm); } diff --git a/casic/iris/CasicIrisInterface.h b/casic/iris/CasicIrisInterface.h index 50c0566..d13b31f 100644 --- a/casic/iris/CasicIrisInterface.h +++ b/casic/iris/CasicIrisInterface.h @@ -26,7 +26,7 @@ CasicIrisInfo irisQualityAssess(CasicIrisInfo irisInfo); CasicIrisInfo irisCodeExtract(CasicIrisInfo irisInfo); - CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); +// CasicIrisInfo irisPreProcess(CasicIrisInfo irisInfo); CasicIrisInfo irisEncode(CasicIrisInfo irisInfo); float calculateMatchScore(CasicIrisFeature feature, CasicIrisInfo irisInfo); @@ -42,7 +42,7 @@ const char * applicationPointsFileName = "./model/points.txt"; int minEyeSize = 320; int maxEyeSize = 480; - float cutRatio = 0.8; + float cutRatio = 0.72; cv::CascadeClassifier * cascade; iristrt::CasicIrisRec rec; diff --git a/casic/iris/CasicIrisRec.cpp b/casic/iris/CasicIrisRec.cpp index 5f6f3d9..c8ffe3e 100644 --- a/casic/iris/CasicIrisRec.cpp +++ b/casic/iris/CasicIrisRec.cpp @@ -213,9 +213,9 @@ cv::Mat resized = addBorders(normalizedImage, max_width); - //cout << resized.size() << endl; - //cv::imshow("resized", resized); - //cv::waitKey(0); +// std::cout << resized.size() << std::endl; +// cv::imshow("resized", resized); +// cv::waitKey(0); cv::Mat img1(resized.size(), CV_32F, 1); cv::Mat img2(resized.size(), encodeImage.depth(), 1); @@ -228,8 +228,8 @@ // Threshold : above or below 0 cv::threshold(img1, img2, 0, 255, cv::THRESH_BINARY); - //cv::imshow("img2", img2); - //cv::waitKey(0); +// cv::imshow("img2", img2); +// cv::waitKey(0); // Form the iris code cv::Mat roi = img2(cv::Rect(max_width, 0, normalizedImage.cols, normalizedImage.rows)); @@ -242,24 +242,25 @@ float CasicIrisRec::matchImage(cv::Mat code1, cv::Mat code2, cv::Mat normalizedMask1, cv::Mat normalizedMask2) { - code1.convertTo(code1,CV_8UC1); - code2.convertTo(code2,CV_8UC1); + code1.convertTo(code1, CV_8UC1); + code2.convertTo(code2, CV_8UC1); - cv::Mat temp(applicationPoints.size(),CV_8UC1); + cv::Mat temp(applicationPoints.size(), CV_8UC1); temp.setTo(cv::Scalar(0)); cv::bitwise_and(normalizedMask1, normalizedMask2, temp, applicationPoints); // Copy the mask f times, where f correspond to the number of codes (= number of filters) int n_codes = code1.rows / applicationPoints.rows; + cv::Mat totalMask(code1.size(), CV_8UC1); for (int n = 0; n < n_codes; n++) { cv::Mat maskRoi = totalMask(cv::Rect(0, n*applicationPoints.rows, applicationPoints.cols, applicationPoints.rows)); temp.copyTo(maskRoi); } - //cv::imshow("totalMask", totalMask); - //cv::waitKey(0); +// cv::imshow("totalMask", totalMask); +// cv::waitKey(0); cv::Mat result(code1.size(), CV_8UC1); result.setTo(cv::Scalar(0)); diff --git a/casic/iris/CasicSegPostProcess.cpp b/casic/iris/CasicSegPostProcess.cpp index 8fdacb0..740beb7 100644 --- a/casic/iris/CasicSegPostProcess.cpp +++ b/casic/iris/CasicSegPostProcess.cpp @@ -187,13 +187,13 @@ return result; } -bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil,std::vector & irisCircle, std::vector & pupilCircle) { +bool CasicSegPostProcess::postProcess(cv::Mat & mask, cv::Mat & iris, cv::Mat & pupil, std::vector & irisCircle, std::vector & pupilCircle) { int chessboard_distance = 15; // cv::Mat mask,iris,pupil; - mask.convertTo(mask,CV_8UC1); - iris.convertTo(iris,CV_8UC1); - pupil.convertTo(pupil,CV_8UC1); + mask.convertTo(mask, CV_8UC1); + iris.convertTo(iris, CV_8UC1); + pupil.convertTo(pupil, CV_8UC1); threshold(mask, mask, 127, 255, cv::THRESH_BINARY); threshold(iris, iris, 90, 255, cv::THRESH_BINARY); @@ -267,18 +267,18 @@ // cv::imshow("circleMask", circleMask); // cv::waitKey(0); - //Mat three_mask = Mat::zeros(mask.rows, mask.cols, CV_8UC3); - //vector channels_m; - //for (int i = 0; i < 3; i++) - //{ - // channels_m.push_back(mask); - //} - //merge(channels_m, three_mask); +// cv::Mat three_mask = cv::Mat::zeros(mask.rows, mask.cols, CV_8UC3); +// std::vector channels_m; +// for (int i = 0; i < 3; i++) +// { +// channels_m.push_back(mask); +// } +// merge(channels_m, three_mask); - //circle(three_mask, Point(iris_x, iris_y), iris_r, Scalar(0, 0, 255), 1); - //circle(three_mask, Point(pupil_x, pupil_y), pupil_r, Scalar(0, 0, 255), 1); - //cv::imshow("three_mask", three_mask); - //cv::waitKey(0); +// circle(three_mask, cv::Point(iris_x, iris_y), iris_r, cv::Scalar(0, 0, 255), 1); +// circle(three_mask, cv::Point(pupil_x, pupil_y), pupil_r, cv::Scalar(0, 0, 255), 1); +// cv::imshow("three_mask", three_mask); +// cv::waitKey(0); return true; } diff --git a/device/iris/CasicIrisRecState.cpp b/device/iris/CasicIrisRecState.cpp index 6d2553e..4a313ef 100644 --- a/device/iris/CasicIrisRecState.cpp +++ b/device/iris/CasicIrisRecState.cpp @@ -27,6 +27,7 @@ this->timeStamp = now.toMSecsSinceEpoch(); this->tryCount = 0; this->noEyeCount = 0; + this->matchedId = ""; // LOG(DEBUG) << QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString(); // LOG_DEBUG(QString("[CasicIrisRecState][initRecognize] 虹膜识别状态初始化").toStdString()); diff --git a/device/iris/CasicIrisRecState.h b/device/iris/CasicIrisRecState.h index eea5ddf..f1112f2 100644 --- a/device/iris/CasicIrisRecState.h +++ b/device/iris/CasicIrisRecState.h @@ -32,6 +32,8 @@ CasicIrisInfo * irisInfo; + QString matchedId; + qint8 tryCount = 0; // 识别尝试次数 qint8 noEyeCount = 0; // 连续没有找到眼睛次数 float recogTimeLast = 0.0; // 识别成功耗时 diff --git a/device/iris/IrisRecogProcess.cpp b/device/iris/IrisRecogProcess.cpp index 08c8227..2ad8c87 100644 --- a/device/iris/IrisRecogProcess.cpp +++ b/device/iris/IrisRecogProcess.cpp @@ -2,7 +2,6 @@ #pragma execution_character_set("utf-8") // Qt VS 中文兼容(UTF-8) #endif - #include "IrisRecogProcess.h" IrisRecogProcess::IrisRecogProcess(QObject *parent) : QThread(parent) @@ -40,57 +39,46 @@ // 如果工作标志位为否, 则跳出 if (this->working == false) { - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 图像栈中没有图像则直接返回 if (ProMemory::getInstance().isIrisQueueEmpty() == true) { -// LOG(TRACE) << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString(); -// LOG_TRACE(QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms").toStdString()); qDebug() << QString("[IrisRecogProcess] 虹膜图像栈空, 暂停200ms"); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 识别状态不等于未开始, 表示已经进入识别程序了, 后续不再执行, 等待本次识别过程结束 if (CasicIrisRecState::getInstance().state != CasicIrisRecState::IrisRecStateName::REC_NOT_START) { -// LOG(DEBUG) << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state).toStdString(); - qDebug() << QString("[IrisRecogProcess] 已在一次识别过程中, 暂停200ms。当前状态为: %1").arg(CasicIrisRecState::getInstance().state); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } // 取出虹膜图像栈中的一条数据 + // qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); CasicIrisInfo irisInfo = ProMemory::getInstance().popCasicIris(); -// LOG(DEBUG) << QString("[IrisRecogProcess] 取出虹膜图像").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 取出虹膜图像").toStdString()); - qDebug() << QString("[IrisRecogProcess] 取出虹膜图像"); - // 调用找眼分类器算法 - casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(200); + casic::iris::CasicIrisInterface::getInstance().setMinEyeSize(320); irisInfo = casic::iris::CasicIrisInterface::getInstance().findAndCutEye(irisInfo); + // irisInfo.hasEye = true; // 没有找到眼睛则返回 if (irisInfo.hasEye == false) { // 表示本次识别结束, 可以开始下一次识别过程 -// LOG(DEBUG) << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount).toStdString()); qDebug() << QString("[IrisRecogProcess] 分类器没有找到眼睛,暂停200ms[%1]").arg(CasicIrisRecState::getInstance().noEyeCount); addOneNoEyeCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } -// LOG(DEBUG) << QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString(); -// LOG_DEBUG(QString("[IrisRecogProcess] 找到眼睛调用远程算法进行识别").toStdString()); - // 找到眼睛则开始质量评估和编码 // 调用远程算法进行编码 if (CasicIrisRecState::getInstance().recoginzeId == "0") @@ -101,20 +89,30 @@ 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); + // 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\\photo\\left.bmp", 0); + // irisInfo.matData = cv::imread("d:\\irisLogs\\20231116\\193221-0.460405.bmp", 0); QElapsedTimer timer; timer.start(); - // 进行预处理 如图像 - irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + // 进行预处理 转换成 320 * 240 的三通道图像 送去压缩 + cv::Mat segMat; - QByteArray data((char*)irisInfo.matData.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); + // 图像转换为RGB的彩色图像 + cv::cvtColor(irisInfo.matData, segMat, cv::COLOR_GRAY2RGB); + + // 缩放到320 * 240 + cv::resize(segMat, segMat, cv::Size(SettingConfig::getInstance().IRIS_WIDTH * 0.5, SettingConfig::getInstance().IRIS_HEIGHT * 0.5)); + + // std::string filename = QString("%1\\%2\\%3-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); + // cv::imwrite(filename, segMat); + // irisInfo = casic::iris::CasicIrisInterface::getInstance().irisPreProcess(irisInfo); + + QByteArray data((char*)segMat.data, SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3); // 发送TCP消息去匹配 emit sendDataToExract(data); @@ -126,6 +124,13 @@ connect(clientUtil, &SocketClientUtil::responseReaded, &loop, &QEventLoop::quit); loop.exec(); + if (clientUtil->getResponse().size() < SettingConfig::getInstance().IRIS_WIDTH * 0.5 * SettingConfig::getInstance().IRIS_HEIGHT * 0.5 * 3) { + addOneTryCount(); + qDebug() << QString("算法分割图像失败,暂停200ms[%1 ms]").arg(timer.elapsed()); + this->msleep(THREAD_MSLEEP); // 200ms后再判断 + continue; + } + char recvPupil[320 * 240 * 1]; char recvMask[320 * 240 * 1]; char recvIris[320 * 240 * 1]; @@ -141,13 +146,16 @@ recvIris[i - 2 * 320 * 240] = clientUtil->getResponse().at(i); } + // 成功接收后清除缓存区 + clientUtil->resetRecvBuffer(); + cv::Mat pupil(240, 320, CV_8UC1, recvPupil); cv::Mat mask(240, 320, CV_8UC1, recvMask); cv::Mat iris(240, 320, CV_8UC1, recvIris); irisInfo.segResult.innerMask = pupil; irisInfo.segResult.irisMask = mask; irisInfo.segResult.outerCircle = iris; -/* + /* std::string pupilSeg = QString("%1\\%2\\%3-pupil-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskSeg = QString("%1\\%2\\%3-mask-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string irisSeg = QString("%1\\%2\\%3-iris-seg.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); @@ -158,12 +166,12 @@ qDebug() << QString("算法分割图像成功[%1 ms]").arg(timer.elapsed()); // 分割后的后处理 - if(cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) + if (cv::countNonZero(mask) == 0 || cv::countNonZero(pupil) == 0|| cv::countNonZero(iris) == 0) { qDebug() << "算法分割图像失败,暂停200ms"; addOneTryCount(); - this->msleep(200); // 200ms后再判断 + this->msleep(THREAD_MSLEEP); // 200ms后再判断 continue; } @@ -171,14 +179,13 @@ CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT; timer.restart(); - qDebug() << "开始提取特征"; irisInfo = casic::iris::CasicIrisInterface::getInstance().irisEncode(irisInfo); -/* + std::string codeFilename = QString("%1\\%2\\%3-code.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); std::string maskFilename = QString("%1\\%2\\%3-mask.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).toStdString(); cv::imwrite(codeFilename, irisInfo.irisCode); cv::imwrite(maskFilename, irisInfo.maskNorm); -*/ + qDebug() << QString("虹膜图像编码成功[%1 ms]").arg(timer.elapsed()); // 开始匹配 @@ -186,63 +193,26 @@ { CasicIrisFeature feature = ProMemory::getInstance().getIrisFeatures().at(i); float score = casic::iris::CasicIrisInterface::getInstance().calculateMatchScore(feature, irisInfo); - qDebug() << score; + // SpeakerUtil::getInstance().speak(QString::number(score)); + cv::imwrite(QString("%1\\%2\\%3-%4.bmp").arg("d:\\irisLogs").arg(QDate::currentDate().toString("yyyyMMdd")).arg(QTime::currentTime().toString("HHmmss")).arg(score).toStdString(), irisInfo.matData); if (score <= 0.32) { - // 找到匹配结果 - emit findMatchedIris(feature.personId); - - break; + CasicIrisRecState::getInstance().state = CasicIrisRecState::REC_SEARCH_SUCC; + CasicIrisRecState::getInstance().matchedId = feature.personId; + break ; } } - // 没有匹配上 - addOneTryCount(); + if (CasicIrisRecState::getInstance().state == CasicIrisRecState::REC_SEARCH_SUCC) { + // 找到匹配结果 + emit findMatchedIris(CasicIrisRecState::getInstance().matchedId); -// QByteArray matchResponse; -// LOG(INFO) << QString("算法匹配结果").toStdString() << matchResponse.toStdString(); -// LOG_INFO("算法匹配结果 {}",matchResponse.toStdString()); -/* - // 算法调用返回成功 - if (matchResponse.size() > 0) - { - QString response = matchResponse.mid(5, matchResponse.size() - 6); - QStringList messList = response.split(";"); - QString code = messList.at(0); - if (code.toInt() == 0) - { - QString personId = messList.at(1); - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_SEARCH_SUCC; - -// LOG(INFO) << QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString(); -// LOG_INFO(QString("匹配成功[tm: %1 ms][id: %2]").arg(timer.elapsed()).arg(personId).toStdString()); - - // 保存图像文件 -// cv::imwrite(QString("D:\\irisLogs\\%1-%2.bmp").arg(QDateTime::currentDateTime().toString("HHmmsszzz")).arg(irisInfo.leftOrRight).toStdString(), irisInfo.matData); - - CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_NOT_START; - emit findMatchedIris(personId); - this->afterRecogAction(); - } else if (code.toInt() == -200) - { - // 匹配失败 -// LOG(INFO) << QString("匹配失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("匹配失败: {}", matchResponse.toStdString()); - - // 匹配失败则尝试次数+1 - addOneTryCount(); - } else if (code.toInt() == -100) - { - // 编码失败 -// LOG(INFO) << QString("编码失败: ").toStdString() << matchResponse.toStdString(); -// LOG_INFO("编码失败: {}", matchResponse.toStdString()); - // 编码失败则尝试次数+1 - addOneTryCount(); - } - } else - { - // 超时返回则尝试次数+1 + ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().clearIrisQueue(); + this->setWorking(false); + } else { + // 没有匹配上 addOneTryCount(); - }*/ + } } } @@ -266,8 +236,9 @@ CasicIrisRecState::getInstance().tryCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); + emit failedMatchedIris(); } } @@ -280,14 +251,10 @@ CasicIrisRecState::getInstance().noEyeCount = 0; this->setWorking(false); -// ProMemory::getInstance().irisCam->stopCapture(); + ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().clearIrisQueue(); -// if (qrand() % 10 < 5) { - emit failedMatchedIris(); -// } -// else { -// emit findMatchedIris("1"); -// } + emit failedMatchedIris(); + } } diff --git a/device/iris/IrisRecogProcess.h b/device/iris/IrisRecogProcess.h index 76ef115..f0bd229 100644 --- a/device/iris/IrisRecogProcess.h +++ b/device/iris/IrisRecogProcess.h @@ -1,6 +1,8 @@ #ifndef IRISRECOGPROCESS_H #define IRISRECOGPROCESS_H +#define THREAD_MSLEEP 200 + #include #include #include diff --git a/utils/SocketClientUtil.cpp b/utils/SocketClientUtil.cpp index d4e9c5c..d539d64 100644 --- a/utils/SocketClientUtil.cpp +++ b/utils/SocketClientUtil.cpp @@ -24,6 +24,12 @@ return this->response; } +void SocketClientUtil::resetRecvBuffer() +{ + response.clear(); + response.resize(0); +} + void SocketClientUtil::sendData(QByteArray data) { // data.append(0x0D).append(0x0A); // 自动加\r\n标识一帧结束 diff --git a/utils/SocketClientUtil.h b/utils/SocketClientUtil.h index 2c833e1..96b60e0 100644 --- a/utils/SocketClientUtil.h +++ b/utils/SocketClientUtil.h @@ -15,6 +15,7 @@ void connect(QString host, int port); void closeConnect(); QByteArray getResponse(); + void resetRecvBuffer(); private: QTcpSocket objClient;