基于qt和opencv实现人脸识别打卡系统

最近在学习opencv,因此就想着和QT结合起来实现一个人脸识别的系统来。下面我来给大家讲讲这个项目怎么实现的

1、项目源码 https://github.com/SagapoZ/FaceRecognition

2、由于github传太大的文件下载太慢因此opecv的库我放在csdn上了。

https://download.csdn.net/download/weixin_42127499/11609330

一、功能描述

1、通过识别人脸来实现每日打开的记录

2、可以录制人员信息并且采集人脸信息进行特征模型训练

3、使用sqllite数据库来存储信息

二、所需环境和配置过程

1、开发环境QT5.12+opencv3.4.4+sqlite3

2、如果大家是在windows上运行的话只需要将opencv库放在FaceRecognition这个文件夹下然后按照以下方式配置即可

3、配置qt+opencv其实很简单,下面先看看在这个项目的文件目录吧

下面看看怎么在qt中配置吧

1、首先肯定要加入sql这个模块啦

2、然后配置opencv_contrib-3.4.4和opencv库,这些在我的源码中都已经配置好了这里就说面一下

#配置源码
SOURCES += \
        main.cpp \
        admingui.cpp \
    src/bif.cpp \
    src/eigen_faces.cpp \
    src/face_alignment.cpp \
    src/face_basic.cpp \
    src/facemark.cpp \
    src/facemarkAAM.cpp \
    src/facemarkLBF.cpp \
    src/facerec.cpp \
    src/fisher_faces.cpp \
    src/getlandmarks.cpp \
    src/lbph_faces.cpp \
    src/mace.cpp \
    src/predict_collector.cpp \
    src/regtree.cpp \
    src/trainFacemark.cpp \
    inputfacethread.cpp \
    facetrainthread.cpp \
    facelogin.cpp \
    showtable.cpp

#配置头文件
HEADERS += \
        admingui.h \
    face/bif.hpp \
    face/face_alignment.hpp \
    face/facemark.hpp \
    face/facemark_train.hpp \
    face/facemarkAAM.hpp \
    face/facemarkLBF.hpp \
    face/facerec.hpp \
    face/mace.hpp \
    face/predict_collector.hpp \
    face.hpp \
    src/face_alignmentimpl.hpp \
    src/face_utils.hpp \
    src/precomp.hpp \
    inputfacethread.h \
    facetrainthread.h \
    facelogin.h \
    showtable.h

#配置opencv库
INCLUDEPATH+=../opencv64/include\
             ../opencv64/include/opencv\
             ../opencv64/include/opencv2\

LIBS += ../opencv64/x64/mingw/lib/libopencv_world344.dll.a

3、下面最关键的地方,(在这里出过几次问题),配置opencv可执行文件的路径

按照图示地方在path中加上opencv的bin路径,在我的工程中路径是../opencv64/x64/mingw/bin

到这里配置工作都完成了

三、实现过程

首先我设计了三个界面分别完成打卡,训练,查表三个功能

1、打开界面及功能的设计

界面如下

点击蓝色的人脸按钮即可开机摄像头开始识别人脸,下面说说这个功能的代码部分

这里我是使用了一个定时器来实现摄像头摄像功能

void FaceLogin::on_recfaceBt_clicked()
{
    //人脸识别
    //打开默认摄像头
    cap = cv::VideoCapture(0);
    if (!cap.isOpened())
    {
        cout<<"open failed"<<endl;
        return;
    }
    qDebug()<<"open success"<<endl;
    //训练好的文件名称
    cascade.load("../AdminGUI/haarcascade_frontalface_alt2.xml");
    model = face::FisherFaceRecognizer::create();
    //1.加载训练好的分类器
    model->read("../AdminGUI/datamodel/MyFaceFisherModel.xml");// opencv2用load

    //开启定时器
    connect(&mtime,SIGNAL(timeout()),this,SLOT(faceRecog()));
    mtime.start(25);
}

2、模型训练

训练模型用到了opencv的Facerecognizer类。opencv中所有的人脸识别模型都是来源于这个类FaceRecognizer这个类目前包含三种人脸识别方法:基于PCA变换的人脸识别(EigenFaceRecognizer)、基于Fisher变换的人脸识别(FisherFaceRecognizer)、基于局部二值模式的人脸识别(LBPHFaceRecognizer)。

 Ptr<face::BasicFaceRecognizer> model = face::EigenFaceRecognizer::create();
 model->train(images, labels);
 model->save("../AdminGUI/datamodel/MyFacePCAModel.xml");//保存路径可自己设置

 Ptr<face::BasicFaceRecognizer> model1 = face::FisherFaceRecognizer::create();
 model1->train(images, labels);
 model1->save("../AdminGUI/datamodel/MyFaceFisherModel.xml");

 Ptr<face::LBPHFaceRecognizer> model2 = face::LBPHFaceRecognizer::create();
 model2->train(images, labels);
 model2->save("../AdminGUI/datamodel/MyFaceLBPHModel.xml");

其实也就三行代码就完成了,是不是很简单呢

3、查询

查询模块非常简单,我使用到了tableView这个模块,将它与QSqlTableModel模型绑定即可

 //绑定模型
 smodel.setTable("user"); //给模型绑定数据表格
 ui->tableView->setModel(&smodel);//把模型与显示view绑定
 smodel.select();

四、效果

五、总结

项目到这里就已经完成了,其实实现过程并不是很难。很多地方都是环境的配置等等有些问题。不过这个项目还是有很多不足的地方。首先还是识别精确度需要完善,其次就是在训练模型等方面,每次新增一个用户就需要全部重新训练模型,这个会大大增长训练时间。然后,就是一些人性化的设计还不够完善,后期在这个基础上去进行更多的功能吧。最后学到的最大的收获就是c++的内存管理。由于在本项目中有很多线程,这些线程都是占用的对空间因此一定要记得释放,避免造成内存泄漏等问题。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值