Newer
Older
CasicBioRecNew / AddPersonForm.cpp
Tan Yue on 7 Jun 2022 24 KB 20220607 虹膜识别
#include "AddPersonForm.h"
#include "ui_AddPersonForm.h"


AddPersonForm::AddPersonForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AddPersonForm)
{
    ui->setupUi(this);

    // 加载css文件设置控件样式
    QFile file(QApplication::applicationDirPath() + "/qss/addPerson.css");
    if (file.open(QFile::ReadOnly))
    {
        QString qssStr = QLatin1String(file.readAll());
        this->setStyleSheet(qssStr);
        file.close();
    }

    SelectDeptUtil::getInstance().initSelectDept(ui->selectDept, CacheManager::getInstance().getDeptCachePtr());

    faceLabel = new QLabel(this);
    faceLabel->hide();

    leftIrisLabel = new QLabel(this);
    leftIrisLabel->hide();
    rightIrisLabel = new QLabel(this);
    rightIrisLabel->hide();

    // 绑定图像双击槽函数
    connect(ui->labPhotoFace, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoFaceDoubleClicked);
    connect(ui->labPhotoEyeLeft, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoIrisDoubleClicked);
    connect(ui->labPhotoEyeRight, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoIrisDoubleClicked);
}

AddPersonForm::~AddPersonForm()
{
    delete ui;
}

void AddPersonForm::setPersonId(QString personId)
{
    this->personId = personId;
}

void AddPersonForm::updateFormTitle(QString title)
{
    ui->labPersonTitle->setText(title);
}

void AddPersonForm::loadPersonInfo(QString personId)
{
    SysPersonDao personDao;
    QVariantMap person = personDao.findRecordById(personId);
    if (person.isEmpty() == false)
    {
        // 赋值姓名
        ui->inputName->setText(person.find("name")->toString());
        ui->inputName->setDisabled(true);
        // 赋值员工编号
        ui->inputCardNo->setText(person.find("person_code")->toString());
        ui->inputCardNo->setDisabled(true);
        // 赋值性别 如果不为空则不能修改
        QString gender = person.find("gender")->toString();
        if (gender == "1")
        {
            ui->radioMale->setChecked(true);
            ui->radioFemale->setDisabled(true);
        } else if (gender == "2")
        {
            ui->radioMale->setDisabled(true);
            ui->radioFemale->setChecked(true);
        } else
        {
            ui->radioMale->setChecked(false);
            ui->radioMale->setChecked(false);
        }
        // 赋值部门 部门可以重新选择
        QString deptId = person.find("deptid")->toString();
        SelectDeptUtil::getInstance().checkDeptSelected(ui->selectDept, CacheManager::getInstance().getDeptCachePtr(), deptId);

        // 查询并显示人脸照片
        FaceDataImgDao faceImgDao;
        QVariantMap faceImage = faceImgDao.findRecordByPersonId(personId);
        ui->labPhotoFace->setPixmap(QPixmap(":/images/photoFace.png"));
        if (faceImage.isEmpty() == false)
        {
            if (faceImage.find("face_image")->toString().isEmpty() == false)
            {
                QString imageData = faceImage.find("face_image")->toString();
                QImage image;
                QPixmap pixmap;
                image.loadFromData(QByteArray::fromBase64(imageData.toLatin1()));
                image = image.scaledToHeight(240, Qt::SmoothTransformation);
                pixmap = QPixmap::fromImage(image);
                ui->labPhotoFace->setPixmap(pixmap);
            }
        }

        // 查询并显示虹膜照片
        IrisDataImgDao irisImgDao;
        QVariantMap irisImage = irisImgDao.findRecordByPersonId(personId);
        ui->labPhotoEyeLeft->setPixmap(QPixmap(":/images/photoEyeLeft.png"));
        ui->labPhotoEyeRight->setPixmap(QPixmap(":/images/photoEyeRight.png"));
        if (irisImage.isEmpty() == false)
        {
            if (irisImage.find("left_image1")->toString().isEmpty() == false)
            {
                QString imageDataLeft = irisImage.find("left_image1")->toString();
                QImage imageLeft;
                QPixmap pixmapLeft;
                imageLeft.loadFromData(QByteArray::fromBase64(imageDataLeft.toLatin1()));
                pixmapLeft = QPixmap::fromImage(imageLeft);
                pixmapLeft = pixmapLeft.scaled(200, 150);
                ui->labPhotoEyeLeft->setPixmap(pixmapLeft);
            }

            if (irisImage.find("right_image1")->toString().isEmpty() == false)
            {
                QString imageDataRight = irisImage.find("right_image1")->toString();
                QImage imageRight;
                QPixmap pixmapRight;
                imageRight.loadFromData(QByteArray::fromBase64(imageDataRight.toLatin1()));
                pixmapRight = QPixmap::fromImage(imageRight);
                pixmapRight = pixmapRight.scaled(200, 150);
                ui->labPhotoEyeRight->setPixmap(pixmapRight);
            }
        }

        // 查询并显示识别记录

    }
}

void AddPersonForm::clearPersonInfo()
{
    ui->inputName->setDisabled(false);
    ui->inputCardNo->setDisabled(false);
    ui->radioMale->setDisabled(false);
    ui->radioFemale->setDisabled(false);
    ui->radioMale->setAutoExclusive(false);
    ui->radioFemale->setAutoExclusive(false);

    ui->inputName->setText("");
    ui->inputCardNo->setText("");
    ui->radioMale->setChecked(false);
    ui->radioFemale->setChecked(false);
    ui->selectDept->setCurrentIndex(0);

    ui->radioMale->setAutoExclusive(true);
    ui->radioFemale->setAutoExclusive(true);

    ui->labPhotoFace->setScaledContents(false);
    ui->labPhotoFace->setPixmap(QPixmap(":/images/photoFace.png"));

    ui->labPhotoEyeLeft->setPixmap(QPixmap(":/images/photoEyeLeft.png"));
    ui->labPhotoEyeRight->setPixmap(QPixmap(":/images/photoEyeRight.png"));
}

void AddPersonForm::drawImageOnForm(QImage imageDisp)
{
    if (this->faceLabel->isVisible() == true)
    {
        LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height();

        faceLabel->setPixmap(QPixmap::fromImage(imageDisp));
    }
}
void AddPersonForm::drawIrisImageOnFrame(QImage image, int leftOrRight)
{
    if (this->leftIrisLabel->isVisible() == true)
    {
        if (leftOrRight == 0)
        {
            leftIrisLabel->setPixmap(QPixmap::fromImage(image));
        } else if (leftOrRight == 1)
        {
            rightIrisLabel->setPixmap(QPixmap::fromImage(image));
        }
    }
}

void AddPersonForm::onFailedCaptureFace()
{
    // 隐藏人脸画面显示界面
    faceLabel->hide();

    // 停止拍图
    ProMemory::getInstance().faceCam->stopTakingPhoto();

    // 语音提示
    SpeakerUtil::getInstance().speak(QString("没有找到人脸,请重试"));
}

void AddPersonForm::onSuccessCaptureFace(QString personIdByFace)
{
    // 隐藏人脸画面显示界面
    faceLabel->hide();

    // 停止拍图
    ProMemory::getInstance().faceCam->stopTakingPhoto();

    // 语音提示
    SpeakerUtil::getInstance().speak(QString("人脸采集成功"));

    // 重置识别状态码
    CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START;

    LOG(DEBUG) << "人脸采集成功";
    if (personIdByFace == "")
    {
        // 人脸库中没有
        // 设置显示人脸照片
        face = CasicFaceRecState::getInstance().imgBase64;
        QPixmap pm;
        pm.loadFromData(QByteArray::fromBase64(face.toLocal8Bit()));
        pm = pm.scaledToHeight(240, Qt::SmoothTransformation);
        ui->labPhotoFace->setPixmap(pm);

        // 计算特征值的字节数组
        for (int i = 0; i < 1024; i++)
        {
            faceCode.append(ByteUtil::floatToBytes(CasicFaceRecState::getInstance().faceInfo->feature[i]));
        }
        this->faceReCaptured = true;
    } else {
        // 命中人脸库中的某人 分以下情况
        // 1. this.personId == "" 表示是重复注册 加载人员信息并语音提示
        // 2. personIdByFace == this.personId 表示是同一个人重新采集人脸 只更新人脸照片和人脸特征值
        // 3. personIdByFace != this.personId 表示重新采集人脸时识别到另一人 需要重新编辑
        if (this->personId.isEmpty() == true)
        {
            // 情况1 重复注册
            loadPersonInfo(personIdByFace);

            // 语音提示
            SpeakerUtil::getInstance().speak(QString("人脸重复注册,请重试"));
            LOG(DEBUG) << "人脸已经注册" << ui->inputName->text().toStdString();
        } else
        {
            if (this->personId == personIdByFace)
            {
                // 情况2 编辑本人
                face = CasicFaceRecState::getInstance().imgBase64;
                QPixmap pm;
                pm.loadFromData(QByteArray::fromBase64(face.toLocal8Bit()));
                pm = pm.scaledToHeight(240, Qt::SmoothTransformation);
                ui->labPhotoFace->setPixmap(pm);

                // 计算特征值的字节数组
                for (int i = 0; i < 1024; i++)
                {
                    faceCode.append(ByteUtil::floatToBytes(CasicFaceRecState::getInstance().faceInfo->feature[i]));
                }

                this->faceReCaptured = true;
            } else {
                // 情况3 编辑时非本人 人脸重复

                // 语音提示
                SpeakerUtil::getInstance().speak(QString("人脸已注册其他人,请重试"));
                LOG(DEBUG) << "人脸已注册其他人" << ui->inputName->text().toStdString();
            }
        }
    }
}

void AddPersonForm::onFailedCaptureIris()
{
    // 隐藏虹膜画面显示界面
    leftIrisLabel->hide();
    rightIrisLabel->hide();

    // 停止拍图
    ProMemory::getInstance().irisCam->stopCapture();

    ProMemory::getInstance().irisRegistPro->setWorking(false);

    // 语音提示
    SpeakerUtil::getInstance().speak(QString("虹膜采集失败,请重试"));
}

void AddPersonForm::onMatchedIris(QString personIdByIris)
{
    // 找到重复的人 提示需要重新采集
    leftIrisLabel->hide();
    rightIrisLabel->hide();

    // 停止拍图
    ProMemory::getInstance().irisCam->stopCapture();
    ProMemory::getInstance().irisRegistPro->setWorking(false);

    if (this->personId.isEmpty() == true)
    {
        // 情况1 新注册 重复注册
        loadPersonInfo(personIdByIris);

        // 语音提示
        SpeakerUtil::getInstance().speak(QString("虹膜已经注册,请重试"));
        LOG(DEBUG) << "虹膜已经注册" << ui->inputName->text().toStdString();
    } else {
        // 语音提示
        SpeakerUtil::getInstance().speak(QString("虹膜已注册其他人,请重试"));
        LOG(DEBUG) << "虹膜已注册其他人" << personIdByIris.toStdString();
    }
}

void AddPersonForm::onSuccessCaptureIrisWithoutMatch(CasicIrisInfo * irisInfo)
{
    LOG(INFO) << QString("[AddPersonForm]虹膜编码成功[%1][%2]").arg(irisInfo->leftOrRight).arg(CasicIrisRecState::getInstance().state).toStdString();
    updateIrisImage(irisInfo);

    if (irisInfo->leftOrRight == "left")
    {
        // 已经找到右眼, 又找到左眼则编码成功
        if (CasicIrisRecState::getInstance().state == CasicIrisRecState::IrisRecStateName::REC_RIGHT_FIND_EYE)
        {
            CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT;

            SpeakerUtil::getInstance().speak("虹膜采集成功");
            ProMemory::getInstance().irisCam->stopCapture();
            this->irisReCaptured = true;
        } else
        {
            SpeakerUtil::getInstance().speak("左眼虹膜编码成功");
            CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_LEFT_FIND_EYE;
            ProMemory::getInstance().irisRegistPro->setWorking(true); // 左眼采集成功 重新开始工作
        }
    } else
    {
        // 已经找到左眼, 又找到右眼则编码成功
        if (CasicIrisRecState::getInstance().state == CasicIrisRecState::IrisRecStateName::REC_LEFT_FIND_EYE)
        {
            CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT;

            SpeakerUtil::getInstance().speak("虹膜采集成功");
            ProMemory::getInstance().irisCam->stopCapture();
            this->irisReCaptured = true;
        } else
        {
            SpeakerUtil::getInstance().speak("右眼虹膜编码成功");
            CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_RIGHT_FIND_EYE;
            ProMemory::getInstance().irisRegistPro->setWorking(true); // 右眼采集成功 重新开始工作
        }
    }
}

bool AddPersonForm::validateForm()
{
    // 验证姓名字段
    QString nameValue = ui->inputName->text().trimmed();
    if (nameValue.isEmpty())
    {
//        ui->inputName->setStyleSheet("border: 2px solid #FF1111;");
        ui->inputName->setPlaceholderText("姓名不能为空");
        return false;
    } else
    {
        ui->inputName->setText(nameValue);
//        ui->inputName->setStyleSheet("border: 1px solid #CCCCCC;");
    }

    // 验证所在部门
    int deptIndex = ui->selectDept->currentIndex();
    if (deptIndex == 0)
    {
//        ui->selectDept->setStyleSheet("border: 2px solid #FF1111;");
        return false;
    } else
    {
//        ui->selectDept->setStyleSheet("border: 1px solid #CCCCCC;");
    }

    return true;
}

void AddPersonForm::registPerson()
{
    SysPersonDao personDao;

    QVariantMap perToRegist;

    // 添加姓名 员工编号 所在部门 性别等信息
    perToRegist.insert("name", ui->inputName->text());
    perToRegist.insert("person_code", ui->inputCardNo->text());
    perToRegist.insert("deptid", ui->selectDept->currentData().toString());
    QString gender = "";
    if (ui->radioMale->isChecked())
    {
        gender = "1";
    } else if (ui->radioFemale->isChecked())
    {
        gender = "2";
    }
    perToRegist.insert("gender", gender);

    // 数据库操作
    QString perIdReg = personDao.save(perToRegist);

    // 注册人脸信息
    if (face.isEmpty() == false && faceCode.isEmpty() == false)
    {
        FaceDataDao faceDataDao;
        FaceDataImgDao faceImgDao;

        QVariantMap faceVar;
        faceVar.insert("person_id", perIdReg);
        faceVar.insert("face_image", face);
        faceVar.insert("face_code", faceCode);
        QString faceImgId = faceImgDao.save(faceVar);
        if (faceImgId.toULongLong() > 0)
        {
            faceVar.insert("image_id", faceImgId);
        }
        QString faceCodeId = faceDataDao.save(faceVar);

        if (faceImgId.toULongLong() < 0 || faceCodeId.toULongLong() < 0)
        {
            OperationTipsDialog tipsDlg;
            tipsDlg.setTipsDialogType(false);
            tipsDlg.setTipsText(QString("%1 人脸保存失败").arg(ui->inputName->text()));
            tipsDlg.exec();
            return;
        } else {
            // 人脸保存成功 更新SYS_PERSON表的人脸字段
            QVariantMap faceValid;
            faceValid.insert("face_valid", "1");
            personDao.edit(faceValid, perIdReg);
        }

        // 重新加载人脸库
        ProMemory::getInstance().initFaceFeatures();
    }

    // 注册虹膜信息
    if (leftIrisCode.isEmpty() == false && rightIrisCode.isEmpty() == false)
    {
        IrisDataDao irisDao;
        IrisDataImgDao irisImgDao;

        QVariantMap irisVar;
        irisVar.insert("person_id", perIdReg);
        irisVar.insert("left_image1", leftIris);
        irisVar.insert("right_image1", rightIris);
        irisVar.insert("left_iris_code1", leftIrisCode);
        irisVar.insert("right_iris_code1", rightIrisCode);
        QString irisImgId = irisImgDao.save(irisVar);
        if (irisImgId.toULongLong() > 0)
        {
            irisVar.insert("image_id", irisImgId);
        }

        QString irisCodeId = irisDao.save(irisVar);
        if (irisImgId.toULongLong() < 0 || irisCodeId.toULongLong() < 0)
        {
            OperationTipsDialog tipsDlg;
            tipsDlg.setTipsDialogType(false);
            tipsDlg.setTipsText(QString("%1 虹膜保存失败").arg(ui->inputName->text()));
            tipsDlg.exec();
            return;
        } else {
            // 虹膜保存成功 更新SYS_PERSON表的虹膜字段
            QVariantMap irisValid;
            irisValid.insert("iris_valid", "1");
            personDao.edit(irisValid, perIdReg);
        }

        // 重新加载虹膜库
        ProMemory::getInstance().initIrisFeatures();
    }

    // 弹出提示框
    bool succ = perIdReg == "-1" ? false : true;
    OperationTipsDialog tipsDlg;
    tipsDlg.setTipsDialogType(succ);
    tipsDlg.setTipsText(QString("%1 人员注册%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败"));
    int ret = tipsDlg.exec();

    LOG(INFO) << QString("%1 人员注册%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败").toStdString();

    if (ret == 1)
    {
        emit switchToUserListForm();
    }
}

void AddPersonForm::editPersonInfo()
{
    SysPersonDao personDao;

    // 只能重新选择所在部门
    QVariantMap perToEdit;
    perToEdit.insert("deptid", ui->selectDept->currentData().toString());

    // 如果性别为空则可以重新选择
    QString gender = "";
    if (ui->radioMale->isChecked())
    {
        gender = "1";
    } else if (ui->radioFemale->isChecked())
    {
        gender = "2";
    }
    perToEdit.insert("gender", gender);

    // 数据库操作
    bool succ = personDao.edit(perToEdit, personId);

    // 需要更新人脸数据
    if(this->faceReCaptured == true &&
            face.isEmpty() == false && faceCode.isEmpty() == false)
    {
        QVariantMap faceVar;
        faceVar.insert("face_image", face);
        faceVar.insert("face_code", faceCode);

        QString faceImgId;
        QString faceCodeId;

        // 更新人脸图像数据
        FaceDataImgDao faceImgDao;
        QVariantMap faceImageRec = faceImgDao.findRecordByPersonId(personId); // 查找人脸照片数据库记录
        if (faceImageRec.isEmpty() == true)
        {
            // 没有找到记录 需要新增一条人脸图像
            faceVar.insert("person_id", personId);
            faceImgId = faceImgDao.save(faceVar);
        } else {
            // 找到一条记录
            faceImgId = faceImageRec.value("id").toString();
            faceImgDao.edit(faceVar, faceImgId);
        }

        // 更新人脸特征值数据
        FaceDataDao faceDataDao;
        QVariantMap faceCodeRec = faceDataDao.findRecordByPersonId(personId); // 查找人脸特征值数据库记录
        if (faceCodeRec.isEmpty() == true)
        {
            // 没有找到记录 需要新增一条人脸特征值
            faceVar.insert("person_id", personId);
            faceVar.insert("image_id", faceImgId);
            faceCodeId = faceDataDao.save(faceVar);
        } else {
            // 找到一条记录
            faceCodeId = faceCodeRec.value("id").toString();
            faceDataDao.edit(faceVar, faceCodeId);
        }

        this->faceReCaptured = false;

        // 人脸保存成功 更新SYS_PERSON表的人脸字段
        QVariantMap faceValid;
        faceValid.insert("face_valid", "1");
        personDao.edit(faceValid, personId);

        // 重新加载人脸库
        ProMemory::getInstance().initFaceFeatures();
    }

    // 需要更新虹膜数据
    if (irisReCaptured == true &&
            leftIrisCode.isEmpty() == false && rightIrisCode.isEmpty() == false)
    {
        QVariantMap irisVar;
        irisVar.insert("left_image1", leftIris);
        irisVar.insert("right_image1", rightIris);
        irisVar.insert("left_iris_code1", leftIrisCode);
        irisVar.insert("right_iris_code1", rightIrisCode);

        QString irisImgId;
        QString irisCodeId;

        // 更新虹膜图像数据
        IrisDataImgDao irisImgDao;
        QVariantMap irisImageRec = irisImgDao.findRecordByPersonId(personId); // 查找人脸照片数据库记录
        if (irisImageRec.isEmpty() == true)
        {
            // 没有找到记录 需要新增一条人脸图像
            irisVar.insert("person_id", personId);
            irisImgId = irisImgDao.save(irisVar);
        } else {
            // 找到一条记录
            irisImgId = irisImageRec.value("id").toString();
            irisImgDao.edit(irisVar, irisImgId);
        }

        // 更新虹膜特征值数据
        IrisDataDao irisDao;
        QVariantMap irisCodeRec = irisDao.findRecordByPersonId(personId); // 查找人脸特征值数据库记录
        if (irisCodeRec.isEmpty() == true)
        {
            // 没有找到记录 需要新增一条人脸特征值
            irisVar.insert("person_id", personId);
            irisVar.insert("image_id", irisImgId);
            irisCodeId = irisDao.save(irisVar);
        } else {
            // 找到一条记录
            irisCodeId = irisCodeRec.value("id").toString();
            irisDao.edit(irisVar, irisCodeId);
        }

        this->irisReCaptured = false;

        // 虹膜保存成功 更新SYS_PERSON表的虹膜字段
        QVariantMap irisValid;
        irisValid.insert("iris_valid", "1");
        personDao.edit(irisValid, personId);

        // 重新加载虹膜库
        ProMemory::getInstance().initIrisFeatures();
    }

    // 弹出提示框
    OperationTipsDialog tipsDlg;
    tipsDlg.setTipsDialogType(succ);
    tipsDlg.setTipsText(QString("%1 人员信息编辑%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败"));
    tipsDlg.exec();

    LOG(INFO) << QString("%1 人员信息编辑%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败").toStdString();
}

void AddPersonForm::updateIrisImage(CasicIrisInfo * irisInfo)
{
    if (irisInfo->leftOrRight == "left")
    {
        // 显示左眼的虹膜图像
        QPixmap pmLeft = QPixmap::fromImage(irisInfo->data);
        pmLeft = pmLeft.scaled(192, 144);
        ui->labPhotoEyeLeft->setPixmap(pmLeft);

        leftIris = ImageUtil::QImageToBase64(irisInfo->data);

        // 虹膜特征值字节数组
        leftIrisCode = irisInfo->irisCode;
        leftIrisLabel->hide();
    } else if (irisInfo->leftOrRight == "right")
    {
        // 设置显示左右虹膜照片
        QPixmap pmRight = QPixmap::fromImage(irisInfo->data);
        pmRight = pmRight.scaled(192, 144);
        ui->labPhotoEyeRight->setPixmap(pmRight);

        rightIris = ImageUtil::QImageToBase64(irisInfo->data);
        rightIrisCode = irisInfo->irisCode;
        rightIrisLabel->hide();
    }
}

void AddPersonForm::on_btnBack_clicked()
{
    emit switchToUserListForm();
}

void AddPersonForm::on_btnHome_clicked()
{
    emit backToHomePage();
}

void AddPersonForm::on_btnSave_clicked()
{
    if (validateForm() == false)
    {
        return ;
    }

    // 表单验证通过后执行后续保存的操作
    if (personId.isEmpty() == false)
    {
        editPersonInfo();
    } else {
        registPerson();
    }
}

void AddPersonForm::onPhotoFaceDoubleClicked()
{
    ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL);

    // 1人脸图像显示的容器
    faceLabel->resize(1280, 720);
    faceLabel->move(0, 80);
    faceLabel->raise();
    faceLabel->show();

    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::ADD_PERSON_CAPTURE_FACE;
    ProMemory::getInstance().faceRegistPro->setWorking(true);
    CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START;

    LOG(TRACE) << "FACE IMAGE DOUBLE CLICKED";
}

void AddPersonForm::onPhotoIrisDoubleClicked()
{
    LOG(TRACE) << "DOUBLE CLICKED IRIS " << personId.toStdString();

    // 编辑时先发指令重新加载虹膜库 去掉自己
    ProMemory::getInstance().initIrisFeatures(personId);

    // 0. 语音提示开始采集
    SpeakerUtil::getInstance().speak(QString("采集虹膜"));

    // 开始拍图
    ProMemory::getInstance().irisCam->startCapture();

    // 1虹膜图像显示的容器
    leftIrisLabel->resize(640, 480);
    leftIrisLabel->move(0, 80);
    leftIrisLabel->raise();
    leftIrisLabel->show();

    rightIrisLabel->resize(640, 480);
    rightIrisLabel->move(640, 80);
    rightIrisLabel->raise();
    rightIrisLabel->show();

    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::ADD_PERSON_CAPTURE_IRIS;
    ProMemory::getInstance().irisRegistPro->setWorking(true); // 开始工作
}