#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; }