Newer
Older
CasicBioRecNew / device / FaceCameraController.cpp
Tan Yue on 7 Jun 2022 3 KB 20220607 虹膜识别
#include "FaceCameraController.h"


FaceCameraController::FaceCameraController(QObject *parent) : QObject(parent)
{
    this->faceCap = new cv::VideoCapture(SettingConfig::getInstance().FACE_CAMERA_INDEX, cv::CAP_DSHOW);
    faceCap->set(cv::CAP_PROP_FRAME_WIDTH, SettingConfig::getInstance().FACE_FRAME_WIDTH);
    faceCap->set(cv::CAP_PROP_FRAME_HEIGHT, SettingConfig::getInstance().FACE_FRAME_HEIGHT);

    LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]初始化相机[%1][%2 * %3]")
                  .arg(SettingConfig::getInstance().FACE_CAMERA_INDEX)
                  .arg(SettingConfig::getInstance().FACE_FRAME_WIDTH)
                  .arg(SettingConfig::getInstance().FACE_FRAME_HEIGHT).toStdString();
}

FaceCameraController::~FaceCameraController()
{
    this->closeFaceCamera();
}


void FaceCameraController::openFaceCamera(int mInterval)
{
    stopTakingPhoto();

    // 获取定时器, 绑定定时函数
    connect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout,
            this, &FaceCameraController::getOneFaceFrm);

    // 启动定时器
    TimeCounterUtil::getInstance().faceCapCounter->start(mInterval);
    LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]").arg(mInterval).toStdString();
}

void FaceCameraController::stopTakingPhoto()
{
    disconnect(TimeCounterUtil::getInstance().faceCapCounter, &QTimer::timeout,
               this, &FaceCameraController::getOneFaceFrm);
}

void FaceCameraController::closeFaceCamera()
{
    faceCap->release();

    delete faceCap;
}


void FaceCameraController::getOneFaceFrm()
{
    if (ProMemory::getInstance().widgeFrame == CasicBioRecConst::WidgeFrameName::ADD_PERSON_CAPTURE_FACE)
    {
        // 拍图
        faceCap->read(faceMat);

        LOG(TRACE) << "TAKE ONE FACE FRAME " << faceMat.cols << " * " << faceMat.rows;

        // 左右翻转
        cv::Mat imageMatMiir;
        flip(faceMat, imageMatMiir, 1);

        // clone一个mat, 用于界面显示
        cv::Mat faceMatDisp = imageMatMiir.clone();

        // 利用人脸分类器进行初步的检测
        cv::Rect faceRect = casic::face::CasicFaceInterface::getInstance().faceDetectByCVCascade(faceMatDisp, SettingConfig::getInstance().MIN_FACE_REGIST_SIZE);
        if (faceRect.width > 0)
        {
            // 初筛检测到人脸时将图像入栈
            CasicFaceInfo faceInfo;
            faceInfo.hasFace = false;
            faceInfo.matData = imageMatMiir;

            // 将图片数据压入堆栈
            ProMemory::getInstance().pushCasicFace(faceInfo);

            // 检测到人脸则绘制一个绿色的边框
            rectangle(faceMatDisp, faceRect, cv::Scalar(0, 255, 0), 2);
        }

        // 将mat转成QImage
        QImage imgDisplay = ImageUtil::MatImageToQImage(faceMatDisp);

        // 发送信号用于界面显示
        emit sendImageToDraw(imgDisplay);
    } else if (ProMemory::getInstance().widgeFrame == CasicBioRecConst::WidgeFrameName::RECOGNIZE_RESULT_FORM)
    {
        // 拍图
        faceCap->read(faceMat);

        LOG(TRACE) << "TAKE ONE FACE FRAME " << faceMat.cols << " * " << faceMat.rows;

        // 左右翻转
        cv::Mat imageMatMiir;
        flip(faceMat, imageMatMiir, 1);

        // clone一个mat, 用于界面显示
        cv::Mat faceMatDisp = imageMatMiir.clone();

        CasicFaceInfo faceInfo;
        faceInfo.hasFace = false;
        faceInfo.matData = imageMatMiir;

        // 将图片数据压入堆栈
        ProMemory::getInstance().pushCasicFace(faceInfo);

        // 将mat转成QImage
        QImage imgDisplay = ImageUtil::MatImageToQImage(faceMatDisp);

        // 发送信号用于界面显示
        emit sendImageToDrawForRecognize(imgDisplay);
    }
}

cv::Mat FaceCameraController::takeOneRawFrame()
{
    // 拍图
    cv::Mat camMat;
    faceCap->read(camMat);
    return camMat;
}