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

#include "CasicBioRecWin.h"

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

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


void FaceCameraController::openFaceCamera()
{
    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->setInterval(SettingConfig::getInstance().FACE_FRAME_INTERVAL);
//    TimeCounterUtil::getInstance().faceCapCounter->start();
    TimeCounterUtil::getInstance().faceCapCounter->start(SettingConfig::getInstance().FACE_FRAME_INTERVAL);
    LOG(DEBUG) << QString("[FaceCameraController][openFaceCamera]相机开始拍图[%1ms]")
                  .arg(SettingConfig::getInstance().FACE_FRAME_INTERVAL).toStdString();
}

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

    delete faceCap;
}


void FaceCameraController::getOneFaceFrm()
{
    faceCap->read(faceMat);

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

    cv::Mat imageMatMiir;
    flip(faceMatDisp, imageMatMiir, 1); // 左右翻转
    QImage imgDisplay = ImageUtil::MatImageToQImage(imageMatMiir);

    CasicBioRecWin * rootPtr = (CasicBioRecWin *) this->parent();
    if (rootPtr->getAddPersonFormPtr()->isVisible() == 1)
    {
        rootPtr->getAddPersonFormPtr()->drawImageOnForm(imgDisplay);
    }

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

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

    // 发送信号用于人脸检测和生成特征值
    emit sendImageToDetect(faceMat);
}