C++实现人脸识别系统

face.pro

#-------------------------------------------------
#
# Project created by QtCreator 2024-03-28T11:48:59
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = face
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

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

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#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 Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_openbtn_clicked();

    void on_closebtn_clicked();

    void on_facebtn_clicked();

private:
    Ui::Widget *ui;

    //摄像头相关成员设置
    VideoCapture v;//视频流对象
    Mat src;//存放原图容器
    Mat gray;//存放灰度图
    Mat dst;//存放直方图
    Mat rgb;//存放rgb图
    CascadeClassifier c;//级联分类器类
    vector<Rect> faces;//存放人脸矩形框的容器
    int camera_id;//摄像头的定时器id
    void timerEvent(QTimerEvent *e);//重写定时器事件函数声明

    //人脸录入相关设置
    Ptr<LBPHFaceRecognizer> recognizer;//人脸识别器指针
    vector<Mat> study_faces;//保存录入人脸的数组
    vector<int> study_labels;//保存录入人脸对应标签的数组
    int count;//记录录入人脸次数
    int flag;//区分是人脸录入还是人脸检测
    int face_id;//人脸录入定时器id

    //人脸检测设置
    int check_id;//人脸检测id
};

#endif // WIDGET_H

main.cpp

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

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

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //将QQ设置不可用
    ui->QQbtn->setEnabled(false);

    //打开系统摄像头
    if(!v.open(0))
    {
        QMessageBox::information(this,"","打开系统摄像头失败");
        return;
    }

    //下载级联分类器的配置文件
    if(!c.load("D:\\opencv\\image\\haarcascade_frontalface_alt2.xml"))
    {
        QMessageBox::information(this,"","下载级联分类器失败");
        return;
    }

    //判断人脸录入的文件是否存在
    QFile file("D:\\opencv\\image\\my_face.xml");
    if(file.exists())
    {
        //说明之前录入果人脸
        recognizer=LBPHFaceRecognizer::load<LBPHFaceRecognizer>("D:\\opencv\\image\\my_face.xml");
    }
    else
    {
        //说明之前没有录入过人脸
        recognizer=LBPHFaceRecognizer::create();

    }

    //启动一个人脸检测定时器
    check_id=startTimer(1000);

    //设置可信度
    recognizer->setThreshold(100);//100是极值

}

Widget::~Widget()
{
    delete ui;
}
//打开摄像头按钮对应的槽函数
void Widget::on_openbtn_clicked()
{
    //启动一个定时器
    camera_id=startTimer(30);

}
//定时器超时时自动执行的功能代码
void Widget::timerEvent(QTimerEvent *e)
{
    //判断是否是摄像头定时器超时
    if(e->timerId()==camera_id)
    {
        v.read(src);//读取摄像头中实时每帧图像

        flip(src,src,1);

        //将bgr图转换成rgb
        cvtColor(src,rgb,CV_BGR2RGB);

        //将图像重新设置大小
        cv::resize(rgb,rgb,Size(350,350));

        //灰度处理
        cvtColor(rgb,gray,CV_RGB2GRAY);

        //均衡化处理
        equalizeHist(gray,dst);

        c.detectMultiScale(dst,faces);

        //将矩形框绘制到图像人脸上
        for(int i=0;i<faces.size();i++)
        {
            rectangle(rgb,faces[i],Scalar(255,0,0),1);
        }

        QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
        //将图像设置到label
        ui->label->setPixmap(QPixmap::fromImage(img));
    }

    //判断是否是人脸录入超时
    if(e->timerId()==face_id)
    {
        if(flag==0)
        {
            qDebug() << "人脸录入中,请正视摄像头";
            Mat face=src(faces[0]);

            //灰度处理
            cvtColor(face,face,CV_BGR2GRAY);

            //均衡化处理
            equalizeHist(face,face);

            //存放到数组里
            study_faces.push_back(face);
            study_labels.push_back(1);

            count++;
            if(count==50)//录入50张人脸
            {
                //人脸模型转化成数字模型
                recognizer->update(study_faces,study_labels);

                //保存
                recognizer->save("D:\\opencv\\image\\my_face.xml");

                QMessageBox::information(this,"","人脸录入成功");

                //关闭定时器
                killTimer(face_id);//关闭人脸录入定时器
                count=0;
                study_faces.clear();
                study_labels.clear();
                flag=1;//表示可以进行人脸检测
            }
        }
    }
    //判断是否是人脸检测超时
    if(e->timerId()==check_id)
    {
        if(flag==1)
        {
            QFile file("D:\\opencv\\image\\my_face.xml");
            if(file.exists())
            {
                if(faces.empty() || recognizer.empty())
                {
                    return;
                }
                Mat face=src(faces[0]);
                //灰度处理
                cvtColor(face,face,CV_BGR2GRAY);

                //均衡化处理
                equalizeHist(face,face);

                int lab=-1;
                double con=0.0;
                recognizer->predict(face,lab,con);
                if(lab!=-1)
                {
                    QMessageBox::information(this,"","欢迎主人");
                    ui->QQbtn->setEnabled(true);
                    killTimer(check_id);
                    flag=0;
                }
            }
        }
    }
}
//关闭按钮对应槽函数
void Widget::on_closebtn_clicked()
{
    //关闭定时器
    killTimer(camera_id);
}
//人脸录入按钮对应槽函数
void Widget::on_facebtn_clicked()
{
    count=0;//人脸录入次数为0
    flag=0;//此时表示只能人脸录入
    //启动一个定时器
    face_id=startTimer(50);
}

widget.ui

运行结果

**************************代码来自上海华清远见C++课程老师周锁琴**************************

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 人脸识别系统是一个复杂的技术,需要使用许多不同的算法和技术。如果你想使用 C 语言实现人脸识别系统,您需要了解图像处理、模式识别、机器学习等领域的知识。 下面是一个简单的实现方法: 1. 预处理:对图像进行预处理,包括灰度化、归一化、去噪等。 2. 检测人脸:使用 Haar 特征检测算法或其他人脸检测算法在图像中检测人脸。 3. 提取特征:使用 LBP、HOG 等特征提取算法从人脸图像中提取特征。 4. 训练分类器:使用 SVM、KNN 等分类器对提取的特征进行训练。 5. 识别:使用训练后的分类器对待识别的人脸图像进行识别,并判断它是否属于已知的人。 这仅仅是一个简单的流程,实际的人脸识别系统实现可能需要更多步骤和复杂的算法。如果你想更深入了解人脸识别系统实现,可以查看相关论文和教程。 ### 回答2: 人脸识别系统是一种通过计算机识别和验证人脸的技术,可以广泛应用于安全检测、人脸支付、智能门禁等领域。下面是一个简单的C语言实现人脸识别系统的示例。 首先,我们需要使用一个开源的图像处理库,例如OpenCV。通过引入相关的头文件,我们可以使用OpenCV中的人脸识别算法。 接下来,我们需要读取输入图像,可以通过调用OpenCV的函数实现。然后,我们可以将输入图像转换为灰度图像,以便进行进一步的处理。 在灰度图像上,我们可以使用OpenCV提供的人脸检测算法来检测输入图像中的人脸。这些算法会返回人脸的位置信息,例如人脸所在的矩形区域。 然后,我们可以进一步使用OpenCV中的人脸识别算法对检测到的人脸进行识别和验证。这些算法会将输入的人脸与预先训练好的人脸数据库进行比对,并返回匹配的结果。 最后,我们可以根据人脸识别的结果进行相应的操作,比如显示匹配的人脸信息或执行相应的权限控制等。 需要注意的是,这里只是一个简单的示例,实际的人脸识别系统会更为复杂。在实际应用中,我们通常需要考虑更多的因素,例如人脸图像的预处理、特征提取和分类等。 使用C语言实现人脸识别系统是一个挑战性的任务,但可以通过利用开源库和算法来简化实现过程。此外,还可以结合其他技术和工具,例如人脸识别的硬件设备和云服务,来提高系统的准确性和性能。 ### 回答3: 人脸识别系统是一种能够通过分析和比对人脸图像,识别出特定人脸的技术。下面将以C语言实现一个简单的人脸识别系统。 首先,需要使用C语言中的图像处理库来读取和处理图像。可以使用OpenCV库来完成此任务。通过使用OpenCV库,我们可以打开图像文件,并将其转换为灰度图像。 接下来,我们需要进行面部检测。可以使用哈尔级联分类器算法通过CascadeClassifier类来实现面部检测。这个算法可以通过训练好的级联分类器文件来检测出图像中的面部位置。 在检测到面部之后,我们可以将它从图像中提取出来,并将其进行预处理。可以使用直方图均衡化算法来增加图像的对比度,从而提高面部特征的可见性。 接下来,我们需要将提取出来的面部图像与训练好的人脸特征数据进行比对。可以使用特征向量和支持向量机(SVM)分类器来完成此任务。我们需要训练一个SVM分类器,并使用训练好的模型来比对特征向量。 最后,根据比对结果,我们可以判断出该图像中是否存在特定人脸,从而实现人脸识别。如果人脸匹配成功,则可以将其标记为已识别;否则,则将其标记为未识别。 总结来说,使用C语言实现一个基本的人脸识别系统需要借助图像处理库、面部检测算法、预处理方法和机器学习算法。通过逐步分析图像,提取面部特征,并进行比对,我们可以实现一个简单但有效的人脸识别系统。当然,这只是一个概述,实际的实现可能需要更多的细节和技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值