Newer
Older
CasicBioRecNew / device / FaceCameraController.cpp
#include "FaceCameraController.h"
#include <QThread>
#include <QMetaMethod>

#include "CasicBioRecWin.h"

FaceCameraController::FaceCameraController(QObject *parent) : QObject(parent)
{

}

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


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

    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();

    // 启动定时器
    TimeCounterUtil::getInstance().faceCapCounter->start(SettingConfig::getInstance().FACE_FRAME_INTERVAL);
    LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]")
                  .arg(SettingConfig::getInstance().FACE_FRAME_INTERVAL).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;

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

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

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

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

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

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

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