#include "CasicIrisInterface.h" #include <QElapsedTimer> #include <QDateTime> casic::iris::CasicIrisInterface::CasicIrisInterface() { } casic::iris::CasicIrisInterface::~CasicIrisInterface() { } void casic::iris::CasicIrisInterface::setCascadeFile(QString filename) { this->cascadeName = filename.toStdString(); } void casic::iris::CasicIrisInterface::setMinEyeSize(int minEyeSize) { this->minEyeSize = minEyeSize; } void casic::iris::CasicIrisInterface::setMaxEyeSize(int maxEyeSize) { this->maxEyeSize = maxEyeSize; } CasicIrisInfo casic::iris::CasicIrisInterface::findEye(CasicIrisInfo irisInfo) { // 构建OpenCV自带的眼睛分类器 if (this->cascade == nullptr) { this->cascade = new cv::CascadeClassifier(); this->cascade->load(cascadeName); } QElapsedTimer timer; timer.start(); std::vector<cv::Rect> rect; cv::Size minEyeRectSize(minEyeSize, minEyeSize); cv::Size maxEyeRectSize(maxEyeSize, maxEyeSize); // ★分类器对象调用 cascade->detectMultiScale(irisInfo.matData, rect, 1.1, 3, cv::CASCADE_FIND_BIGGEST_OBJECT, minEyeRectSize, maxEyeRectSize); if (rect.size() == 0) { irisInfo.hasEye = false; return irisInfo; } // LOG(DEBUG) << QString("眼睛检测算法[tm: %1 ms][count: %2][rect: (%3, %4) %5 * %6]") // .arg(timer.elapsed()).arg(rect.size()) // .arg(rect.at(0).x).arg(rect.at(0).y) // .arg(rect.at(0).width).arg(rect.at(0).height).toStdString(); // 找到眼睛之后, 将眼部裁剪下来, 图像拉伸到640 * 480 cv::Point center; center.x = cvFloor(rect.at(0).x + rect.at(0).width*0.5); center.y = cvFloor(rect.at(0).y + rect.at(0).height*0.5); // 限制中心点的范围 if (center.x < SettingConfig::getInstance().IRIS_WIDTH * cutRatio * 0.5) { // x小于240则x=240 center.x = center.x - SettingConfig::getInstance().IRIS_WIDTH * cutRatio * 0.5; } else if (center.x > SettingConfig::getInstance().IRIS_FRAME_WIDTH - SettingConfig::getInstance().IRIS_WIDTH * cutRatio * 0.5) { // x大于1040则x=1040 center.x = SettingConfig::getInstance().IRIS_FRAME_WIDTH - SettingConfig::getInstance().IRIS_WIDTH * cutRatio * 0.5; } if (center.y < SettingConfig::getInstance().IRIS_HEIGHT * cutRatio * 0.5) { // y小于180则y=180 center.y = SettingConfig::getInstance().IRIS_HEIGHT * cutRatio * 0.5; } else if (center.y > SettingConfig::getInstance().IRIS_FRAME_HEIGHT - SettingConfig::getInstance().IRIS_HEIGHT * cutRatio * 0.5) { center.y = SettingConfig::getInstance().IRIS_FRAME_HEIGHT - SettingConfig::getInstance().IRIS_HEIGHT * cutRatio * 0.5; } // 裁剪眼部图像 cv::Mat halfSize = irisInfo.matData.clone(); halfSize = irisInfo.matData(cv::Rect(center.x - SettingConfig::getInstance().IRIS_WIDTH * cutRatio * 0.5, center.y - SettingConfig::getInstance().IRIS_HEIGHT * cutRatio * 0.5, SettingConfig::getInstance().IRIS_WIDTH * cutRatio, SettingConfig::getInstance().IRIS_HEIGHT * cutRatio)); cv::resize(halfSize, halfSize, cv::Size(SettingConfig::getInstance().IRIS_WIDTH, SettingConfig::getInstance().IRIS_HEIGHT)); cv::flip(halfSize, halfSize, 1); // 左右翻转 irisInfo.hasEye = true; irisInfo.eyeRect = rect.at(0); irisInfo.matData = halfSize; irisInfo.data = ImageUtil::MatImageToQImage(halfSize); return irisInfo; } CasicIrisInfo casic::iris::CasicIrisInterface::irisQualityAssess(CasicIrisInfo irisInfo) { return irisInfo; } CasicIrisInfo casic::iris::CasicIrisInterface::irisCodeExtract(CasicIrisInfo irisInfo) { QElapsedTimer timer; timer.start(); // QSocketClientUtil * clientUtil = new QSocketClientUtil(); QByteArray data((char*)irisInfo.matData.data, 640*480); std::cout << "extract iris code" << std::endl; // clientUtil->sendData(data); // if (response.size() == 1024) // { // QLog::getInstance()->logger()->debug(QString("特征值提取[耗时: %1ms][特征值: %2]\n") // .arg(timer.elapsed()) // .arg(QByteUtil::binToHexString(response))); // } else // { // std::cout << response.toStdString() << std::endl; // } return irisInfo; }