Newer
Older
CasicBioRecNew / device / CameraPositionController.cpp
Tan Yue on 30 Jun 2022 2 KB 20220630 可以识别的1.0版本
#include "CameraPositionController.h"

CameraPositionController::CameraPositionController(QObject *parent) : QThread(parent)
{
    this->working = false;
    this->exit = false;
}

CameraPositionController::~CameraPositionController()
{
    this->setWorking(false);
}

void CameraPositionController::setWorking(bool working)
{
    this->working = working;
}
void CameraPositionController::exitThread()
{
    this->working = false;
    this->exit = true;
}

void CameraPositionController::run()
{
    while (exit == false)
    {
        if (this->working == false)
        {
            this->msleep(200); // 200ms后再判断
            continue;
        }

        // 取一幅图像
        cv::Mat rawFrame = ProMemory::getInstance().faceCam->takeOneRawFrame();

        // 分类器找脸
        cv::Rect faceRect = casic::face::CasicFaceInterface::getInstance().faceDetectByCVCascade(rawFrame, SettingConfig::getInstance().MIN_WORK_FACE_SIZE);

        if (faceRect.width != 0)
        {
//            QString facePos = QString("%1 * %2, (%3, %4), (%5, %6)").arg(faceRect.width).arg(faceRect.height)
//                    .arg(faceRect.x).arg(faceRect.y).arg(faceRect.x + faceRect.width).arg(faceRect.y + faceRect.height);

            // 通过人脸的大小判断距离,提示靠近或者远离
            if (faceRect.width < SettingConfig::getInstance().FACE_TOO_CLOSE_SIZE)
            {
                emit updateTips(QString("距离太远,请靠近"));
                emit updateTipsBackgroundColor("#9F1919");
            }
            else if (faceRect.width > SettingConfig::getInstance().FACE_TOO_FAR_SIZE)
            {
                emit updateTips(QString("距离太近,请远离"));
                emit updateTipsBackgroundColor("#9F1919");
            }
            else
            {
                emit updateTips(QString("正在识别,请看向镜头"));
                emit updateTipsBackgroundColor("#248A53");

                int eyeTop = faceRect.y + faceRect.height * 0.35;
                int eyeBottom = faceRect.y + faceRect.height * 0.45;
                if (eyeTop < 250 || eyeBottom > 350) {
                     emit motoControl(faceRect.y + faceRect.height * 0.4);
                }

                // 位置合适 拍两张虹膜图像进行识别
                ProMemory::getInstance().irisCam->getOneFaceFrm();
            }
        }
        this->msleep(200);
    }
}