qt_人脸识别项目

.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-06-16T11:40:21
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = day5_camera05
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

INCLUDEPATH += C:/opencv/opencv3.4-qt-intall/install/include
INCLUDEPATH += C:/opencv/opencv3.4-qt-intall/install/include/opencv
INCLUDEPATH += C:/opencv/opencv3.4-qt-intall/install/include/opencv2
LIBS += C:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include<opencv2/face.hpp>
#include <vector>
#include <map>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QTimerEvent>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>

using namespace  cv;
using namespace cv::face;
using namespace std;


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void timerEvent(QTimerEvent *e); //重写定时器事件处理函数

private slots:


    void on_close_btn_2_clicked();
    void on_face_btn3_clicked();
    void on_open_btn_1_clicked();

private:
    Ui::MainWindow *ui;
    //定义有关处理摄像头的相关变量
    VideoCapture v;       //视频流对象
    Mat src,gray,dst;     //容器:彩色 灰色 均衡化
    Mat rgb;              //bgr-->rgb  转变
    CascadeClassifier c;     //级联分类器
    vector<Rect> faces;       //人脸矩形框
    int cameraTimerId;             //显示摄像头的定时器id
    //定义有关人脸存储的相关变量
    int studyTimerId;       //人脸学习的定时器
    Ptr<LBPHFaceRecognizer> recognize;    //人脸识别器指针
    vector<Mat> study_face;           //学习的人脸容器
    vector<int> study_lab;              //人脸的标签容器
    int count = 0;              //学习次数
    bool flag;                     //标识是在学习还是在检测

    //定义有关人脸预测的变量
    int checkTimerId;


};

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //打开摄像头
    if(v.open(0))
    {
        QMessageBox::information(this,"success","摄像头打开成功");
    }
    //下载级联分类器模型
    c.load("C:/opencv/picture/face.xml");
    //判断人脸文件是否存在
    QFile file("C:/opencv/picture/olivia.xml");
    if(file.exists())
    {
        //文件模型存在  直接下载即可
        recognize = FaceRecognizer::load<LBPHFaceRecognizer>("C:/opencv/picture/olivia.xml");
    }
    else
    {
        //文件模型不存在 需要创建出来
        recognize = LBPHFaceRecognizer::create();
    }
    flag = 1;       //标识为1,说明正在预测;0标识,正在录入人脸。

    //启动人脸预测的定时器
    checkTimerId = this->startTimer(2000);
    //设置可信度
    recognize->setThreshold(90);         //只要检测到的图像可信度低于90 说明人脸识别成功
}

MainWindow::~MainWindow()
{
    delete ui;
}


//打开摄像头按钮对应的槽函数
void MainWindow::on_open_btn_1_clicked()
{
    cameraTimerId = this->startTimer(20);  //启动定时器 每隔20毫秒启动定时器处理事件函数

}
//关闭摄像头按钮对应的槽函数
void MainWindow::on_close_btn_2_clicked()
{
    this->killTimer(cameraTimerId);
}
//定时器事件处理函数
void MainWindow::timerEvent(QTimerEvent *e)
{
    //判断哪个定时器到位
    if(e->timerId() == cameraTimerId)
    {
        //从视频流中获取一张图像
        v.read(src);
        //翻转图像
        flip(src,src,1);

        //灰度处理
        cvtColor(src,gray,CV_BGR2GRAY);
        //均衡化处理
        equalizeHist(gray,dst);
        //获取人脸矩形框
        c.detectMultiScale(dst,faces);
        //将人脸绘制到原图上
        for(int i = 0;i < faces.size();i++)
        {
            rectangle(src,faces[i],Scalar(255,0,0));
        }
        //将src转换成rgb图像
        cvtColor(src,rgb,CV_BGR2RGB);
        //将rgb图重新设置尺寸
        cv::resize(rgb,rgb,Size(300,300));
        //使用rgb图构造出一个QImage图像用于展示到qt的ui界面
        QImage image(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
        //将该图像展示到ui界面上的lab中
        ui->camera_lable->setPixmap(QPixmap::fromImage(image));
    }

    //判断人脸录入定时器是否到位
    if(e->timerId() == studyTimerId)
    {
        qDebug()<<"正在进行人脸录入...";
        //获取ui界面上的矩形框里面的人脸图像
        Mat face;
        face = src(faces[0]);

        //从源图像中截取矩形框区域
        //将该脸进行重新设置大小
        cv::resize(face,face,Size(50,50));
        //灰度处理
        cvtColor(face,face,CV_BGR2GRAY);
        //均衡化处理
        //equalizeHist(face,face,);
        //将该脸放入训练数组中(学习的人脸容器)
        study_face.push_back(face);
        //将该脸的标签放入标签数组
        study_lab.push_back(1);
        count++;        //向训练容器中存放一次
        if(count == 50)
        {
            //存满50后 更新
            //将count清零 以便下次录入
            count = 0;
            //更新人脸模型 //参数1:人脸容器  //参数2:标签容器
            recognize->update(study_face,study_lab);
            //保存人脸到本地
            recognize->save("C:/opencv/picture/olivia.xml");
            //将flag制1,说明已经学习完毕,可以人脸预测了
            flag = 1;
            //将两个容器进行清空
            study_face.clear();
            study_lab.clear();
            //将录入按钮设置成可用状态
            ui->face_btn3->setEnabled(true);
            //提示
            QMessageBox::information(this,"success","人脸录入成功");
            //关闭人脸录入的计时器
            this->killTimer(studyTimerId);
        }
    }
    //判断人脸预测定时器是否到位
    if(e->timerId() == checkTimerId)
    {
        if(flag == 1)
        {
            qDebug()<<"正在检测...";
            QFile file("C:/opencv/picture/olivia.xml");
            if(file.exists())
            {
                //说明人脸模型存在
                if(faces.empty() || recognize.empty())
                {
                    return;
                }//界面上人脸矩形框没有(人没在现场) || 人脸识别器不在
                //!!!真正开始进行人脸识别啦!!!
                Mat face;
                face = src(faces[0]); //获取ui界面中矩形框框起来的人脸
                //重新设置图像大小
                cv::resize(face,face,Size(50,50));
                //灰度处理
                cvtColor(face,face,CV_BGR2GRAY);
                //定义存放返回的lab标签和可信度变量
                int lab = -1;
                double confidence = 0.0;
                //开始进行预测
                recognize->predict(face,lab,confidence);

                //判断是否识别成功
                if(lab != -1)
                {
                    QMessageBox::information(this,"sucess","人脸识别成功");
                   // emit my_signal();  //接口自己写 给别的界面发信号
                    //关闭该界面
                    this->close();
                }
            }
        }
    }
}
//录入人脸按钮对应的槽函数
void MainWindow::on_face_btn3_clicked()
{
    qDebug()<<"开始进行人脸录入...";
    //启动人脸录入的定时器
    studyTimerId = this->startTimer(30);
    //将标识位设置为0,表示现在正在进行人脸录入,先不要进行人脸预测了
    flag = 0;
    //将人脸录入按钮设置成不可用状态
    ui->face_btn3->setEnabled(false);
}

result

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值