最近在学习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
到这里配置工作都完成了
首先我设计了三个界面分别完成打卡,训练,查表三个功能
界面如下
点击蓝色的人脸按钮即可开机摄像头开始识别人脸,下面说说这个功能的代码部分
这里我是使用了一个定时器来实现摄像头摄像功能
void FaceLogin::on_recfaceBt_clicked()
{
//人脸识别
//打开默认摄像头
cap = cv::VideoCapture(0);
if (!cap.isOpened())
{
cout<<"open failed"<read("../AdminGUI/datamodel/MyFaceFisherModel.xml");// opencv2用load
//开启定时器
connect(&mtime,SIGNAL(timeout()),this,SLOT(faceRecog()));
mtime.start(25);
}
训练模型用到了opencv的Facerecognizer类。opencv中所有的人脸识别模型都是来源于这个类FaceRecognizer这个类目前包含三种人脸识别方法:基于PCA变换的人脸识别(EigenFaceRecognizer)、基于Fisher变换的人脸识别(FisherFaceRecognizer)、基于局部二值模式的人脸识别(LBPHFaceRecognizer)。
Ptr model = face::EigenFaceRecognizer::create();
model->train(images, labels);
model->save("../AdminGUI/datamodel/MyFacePCAModel.xml");//保存路径可自己设置
Ptr model1 = face::FisherFaceRecognizer::create();
model1->train(images, labels);
model1->save("../AdminGUI/datamodel/MyFaceFisherModel.xml");
Ptr model2 = face::LBPHFaceRecognizer::create();
model2->train(images, labels);
model2->save("../AdminGUI/datamodel/MyFaceLBPHModel.xml");
其实也就三行代码就完成了,是不是很简单呢
查询模块非常简单,我使用到了tableView这个模块,将它与QSqlTableModel模型绑定即可
//绑定模型
smodel.setTable("user"); //给模型绑定数据表格
ui->tableView->setModel(&smodel);//把模型与显示view绑定
smodel.select();
项目到这里就已经完成了,其实实现过程并不是很难。很多地方都是环境的配置等等有些问题。不过这个项目还是有很多不足的地方。首先还是识别精确度需要完善,其次就是在训练模型等方面,每次新增一个用户就需要全部重新训练模型,这个会大大增长训练时间。然后,就是一些人性化的设计还不够完善,后期在这个基础上去进行更多的功能吧。最后学到的最大的收获就是c++的内存管理。由于在本项目中有很多线程,这些线程都是占用的对空间因此一定要记得释放,避免造成内存泄漏等问题。