Newer
Older
CasicBioRecNew / casic / iris / CasicIrisInterface.cpp
#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;
}