利用 QT 完成一个人脸识别系统,完成登录操作

1.配置文件

# Project created by QtCreator 2023-09-22T10:34:23
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = project
TEMPLATE = appSOURCES += main.cpp\widget.cppHEADERS  += widget.hFORMS    += 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

2.头文件

#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>
using namespace  cv;
using namespace cv::face;
using namespace std;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_openCameraBtn_clicked();void on_closeCameraBtn_clicked();void on_studyBtn_clicked();private:Ui::Widget *ui;/***************功能模块1:摄像头的获取并展示****************/VideoCapture v;              //视频流对象Mat src;                     //获取摄像头原图Mat rgb;                     //存放rgb图Mat gray;                     //灰度图Mat dst;                      //均衡化图CascadeClassifier c;          //级联分类器vector<Rect> faces;            //人脸矩形框容器int camera_id;                  //摄像头的定时器void timerEvent(QTimerEvent *e);     //重写定时器事件处理函数/****************功能模块2:人脸录入操作*******************/int study_id;                  //人脸录入的定时器Ptr<FaceRecognizer> recognizer;    //人脸识别器的指针vector<Mat> studyFaces;           //人脸学习的数组vector<int> studyLabs;               //人脸的标签数组int flag;                           //标记是否正在录入人脸int count;                           //记录学习次数/****************功能模块3:人脸检测***********************/int check_id;                      //人脸检测的定时器};#endif // WIDGET_H

3.源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->loginBtn->setEnabled(false);        //将登录按钮设置成不可用状态ui->closeCameraBtn->setEnabled(false);     //关闭摄像头按钮禁用//给级联分类器装载人脸分类模型if(!c.load("D:\\opencv\\resources\\haarcascade_frontalface_alt2.xml")){QMessageBox::information(this,"失败","人脸分类模型下载失败");return;}//创建一个人脸识别器对象QFile file("D:\\opencv\\resources\\myface.xml");if(file.exists()){//表明人脸识别模型存在,直接下载即可recognizer = LBPHFaceRecognizer::load<LBPHFaceRecognizer>("D:\\opencv\\resources\\myface.xml");}else{//人脸模型不存在,需要创建一个recognizer = LBPHFaceRecognizer::create();}//当系统启动时,就要启动人脸检测的定时器check_id = this->startTimer(2000);            //每隔2秒检测一次flag = 0;                  //表明刚开始时处于检测过程recognizer->setThreshold(70);         //设置可信度,当检测的可信度低于100时,表明识别成功}Widget::~Widget()
{delete ui;
}//打开摄像头按钮对应的槽函数
void Widget::on_openCameraBtn_clicked()
{//打开摄像头if(!v.open(0)){QMessageBox::information(this,"失败","摄像头打开失败");return;}//启动定时器,每隔20毫秒,将摄像头中内容展示到ui界面的lab中camera_id = this->startTimer(20);//将该按钮设置成不可用状态ui->openCameraBtn->setEnabled(false);ui->closeCameraBtn->setEnabled(true);}//关闭摄像头按钮对应的槽函数
void Widget::on_closeCameraBtn_clicked()
{//关闭定时器this->killTimer(camera_id);//将启动按钮设置成可用状态ui->openCameraBtn->setEnabled(true);ui->closeCameraBtn->setEnabled(false);ui->faceLab->clear();//关闭摄像头v.release();
}//重写的定时器事件处理函数
void Widget::timerEvent(QTimerEvent *e)
{//判断是哪个定时器到位if(e->timerId() == camera_id){//1、从摄像头中读取一张图像v.read(src);//2、翻转flip(src,src, 1);//3、重新设置大小cv::resize(src,src,Size(300,300));//4、转换为rgb图cvtColor(src,rgb,CV_BGR2RGB);//5、灰度处理cvtColor(rgb, gray, CV_BGR2GRAY);//6、均衡化处理equalizeHist(gray,dst);//7、使用级联分类器找到人脸矩形框c.detectMultiScale(dst, faces);//8、将人脸矩形框绘制到rgb图上for(quint32 i=0; i<faces.size(); i++){rectangle(rgb, faces[i], Scalar(255,0,0), 2);}//9、通过使用Mat类型的rgb图,构造一个QT能够识别的图像QImage img(rgb.data, rgb.cols, rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);//10、将qimage图转换为qpixmap图展示到UI界面ui->faceLab->setPixmap(QPixmap::fromImage(img));}//判断人脸录入的定时器是否到位if(e->timerId() == study_id){qDebug()<<"正在录入,请稍后...";//定义容器,存放摄像头中矩形框框起来的人脸区域Mat face = src(faces[0]);//将人脸重新设置尺寸cv::resize(face,face,Size(100,100));//灰度处理cvtColor(face,face,CV_BGR2GRAY);//均衡化处理equalizeHist(face,face);//将处理好的人脸图像放入学习容器中studyFaces.push_back(face);studyLabs.push_back(1);count++;if(count==60)          //判断是否已经完成学习{//更新人脸识别模型//函数原型:virtual void update(InputArrayOfArrays src, InputArray labels);//功能:将给定的图像模型转换为数据模型//参数1:图像数组//参数2:标签数组recognizer->update(studyFaces,studyLabs);//将人脸数据模型保存到本地磁盘文件中recognizer->save("D:\\opencv\\resources\\myface.xml");//后续操作this->killTimer(study_id);           //关闭定时器ui->studyBtn->setEnabled(true);         //按钮设置成可用状态studyFaces.clear();                     //清空容器studyLabs.clear();flag = 0;                             //设置flag为0,表明可以继续监测人脸count = 0;QMessageBox::information(this,"成功", "录入成功");}}//判断人脸检测定时器是否到位if(e->timerId() == check_id){//判断是否能进行检测if(flag == 0){if(faces.empty() || recognizer.empty())return;qDebug()<<"正在寻找人脸";QFile file("D:\\opencv\\resources\\myface.xml");       //人脸模型存在if(file.exists()){//1、获取摄像头中人脸区域Mat face = src(faces[0]);//2、重新设置大小cv::resize(face,face,Size(100,100));//3、灰度处理cvtColor(face,face, CV_BGR2GRAY);//4、均衡化处理equalizeHist(face,face);//5、准备变量接受预测后的结果int lab = -1;double conf = 0.0;//6、人脸预测recognizer->predict(face, lab, conf);qDebug()<<"lab: "<<lab<<"   conf: "<<conf;//7、判断预测的结果if(lab != -1){//预测成功,给定按钮的权限ui->loginBtn->setEnabled(true);}}}}
}//人脸录入按钮对应的槽函数
void Widget::on_studyBtn_clicked()
{qDebug()<<"开始录入....";study_id = this->startTimer(50);       //每隔50毫秒学习一次count =0;             //计数器清零ui->studyBtn->setEnabled(false);        //按钮不能使用flag = 1;                               //表明正在录入
}

4.主函数

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis面试题(三)

文章目录 前言一、Xml 映射文件中&#xff0c;除了常见的 select|insert|updae|delete 标签之外&#xff0c;还有哪些标签&#xff1f;二、当实体类中的属性名和表中的字段名不一样&#xff0c;如果将查询的结果封装到指定 pojo&#xff1f;三、模糊查询 like 语句该怎么写四、…

24. 图论 - 图的表示种类

Hi&#xff0c;你好。我是茶桁。 之前的一节课中&#xff0c;我们了解了图的来由和构成&#xff0c;简单的理解了一下图的一些相关概念。那么这节课&#xff0c;我们要了解一下图的表示&#xff0c;种类。相应的&#xff0c;我们中间需要穿插一些新的知识点用于更好的去理解图…

C#,数值计算——Multinormaldev的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Multinormaldev : Ran { public Cholesky chol { get; set; } null; private int mm { get; set; } private double[] mean { get; set; } private double[,] xvar {…

shardingjdbc分库分表数据均衡性讨论

问题引入 最近一个业务系统中&#xff0c;因为数据量很大&#xff0c;经过技术选型&#xff0c;综合权衡选择了sharding-Jdbc&#xff0c;本文主要讨论的是分库分表的表达式 我们有一个批次总表A&#xff0c;还有一个明细表B&#xff0c;我们需要对明细表B进行水平拆分&#…

InputAction的使用

感觉Unity中InputAction的使用&#xff0c;步步都是坑。 需求点介绍 当用户长按0.5s 键盘X或者VR left controller primaryButton (即X键)时&#xff0c;显示下一个图片。 步骤总览 创建InputAction资产将该InputAction资产绑定到某个GameObject上在对应的script中&#xf…

计算机视觉与深度学习-经典网络解析-VGG-[北邮鲁鹏]

目录标题 VGG参考VGG网络贡献使用尺寸更小的$3 \times 3$卷积串联来获得更大的感受野放弃使用$11 \times 11$和$5 \times 5$这样的大尺寸卷积核深度更深、非线性更强&#xff0c;网络的参数也更少&#xff1b;去掉了AlexNet中的局部响应归一化层(LRN)层。 网络结构主要改进输入…

UE5蓝图一些有用的节点(最近接触的)

1、Get Actor Forward Vector 获取演员向前的矢量&#xff0c;这得到的是一个基于世界坐标的矢量&#xff0c;应该类似于Unity3D中的Transform.forward。 2、SpawnActor From Class 通过类生成演员对象&#xff0c;这不就是new了一个对象吗&#xff0c;呵呵。 3、Get Control…

21 mysql ref 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

基于abaqus的非等速生长Voronoi晶体模型生成插件

1. 非等速生长晶体模型简介 对于标准Voronoi而言&#xff0c;每个晶粒的生长速率是相同的&#xff0c;任意两个晶粒的交界线为其形核点连线的垂直平分线&#xff0c;交界线为一条直线&#xff0c;如图1.1所示。 图1.1 标准Voronoi晶粒交界线 而对于非等速生长Voronoi晶体而言…

肖sir__项目环境之全流程__005

一、测试流程&#xff08;h模型&#xff09; 1、需求文档&#xff08;产品&#xff09; 需求文档&#xff08;软件需求规格说明书srs&#xff09; &#xff08;1&#xff09;如何分析需求 a、显示需求&#xff08;主流程、功能&#xff0c;业务&#xff09; b、隐性需求&#x…

js惰性函数

看下面这份ts代码 实现的效果也很简单,就是将一份文本,复制到剪切板上,未了兼容更多的浏览器(没错说的就是你>ie !),做了一个兼容性判断, 当浏览器支持navigator.clipboard这个api时,就直接调用这个api将文本复制到剪切板中, 如果不支持这个api的话,就执行else里面的代码,这…

解决qml编译时出现错误ninja: build stopped: subcommand failed.

qml编译时出现错误ninja: build stopped: subcommand failed. 如下图&#xff1a; 解决这个编译错误其实很简单&#xff0c;我把Window写错了&#xff0c;写成了window, 如果有类似的报错&#xff0c;可以检查一下qml代码是否有问题。当然在Qt Creator里也没有错误提示&#x…

仿写Timi记账

项目仿照Timi记账&#xff0c;本 APP 仅用作学习&#xff0c;如有侵权联系删除&#xff0c;项目地址&#xff1a;Timi记账 TIMI记账项目 简单功能对于tableview向上延伸部分采用了insertSubview形式&#xff1a;添加特殊字体添加.ttf文件获取plist文件数据 计算器功能说明简单逻…

MySQL 远程连接1130问题

通过后台进入mysql 1,切换到mysql库 2.查询user表信息 3.更新你想远程登录的用户的host信息,我这里想用root进行远程登录,所以修改如下 4.刷新权限 5.大功告成 快来和博主打成一片吧^_^

dll文件找不到,微软官方地址

dll文件找不到&#xff0c;微软官方地址 文件地址dllMicrosoft Visual C 2008 Redistributable Package ATL 安全更新https://www.microsoft.com/zh-cn/download/details.aspx?id10430Visual C Redistributable for Visual Studio 2012 Update 4https://www.microsoft.com/zh…

【Vue】修饰符、表单提交方式、自定义组件的关键步骤

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

识别准确率达 95%,华能东方电厂财务机器人实践探索

摘 要&#xff1a;基于华能集团公司大数据与人工智能构想理念&#xff0c;结合东方电厂实际工作需要&#xff0c;财务工作要向数字化、智能化纵深推进&#xff0c;随着财务数字化转型和升级加速&#xff0c;信息化水平不断提升&#xff0c;以及内部信息互联互通不断加深&#x…

git之撤销工作区的修改和版本回溯

有时候在工作区做了一些修改和代码调试不想要了,可如下做 (1)步骤1:删除目录代码,确保.git目录不能修改 (2)git log 得到相关的commit sha值 可配合git reflog 得到相要的sha值 (3)执行git reset --hard sha值,可以得到时间轴任意版本的代码 git reset --hard sha值干净的代…

算法基础之高精度总结

目录 高精度算法分类 高精度加减乘除的异同点 加和乘 相同点 减和除 相同点 不同点 处理前导0的方式 高精度算法分类 分类&#xff1a;加、减、乘、除 其中加减乘都适用于两个数都是高精度&#xff0c;除法因为除数是高精度的话不好用整除的方法&#xff0c;所以除法时…

代码随想录算法训练营 单调栈part01

一、每日温度 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 从左到右除了最后一个数其他所有的数都遍历一次&#xff0c;最后一个数据对应的结果肯定是 0&#xff0c;就不需要计算。遍历的时候&#xff0c;每个数都去向后数&#xff0c;直到找到比它大的数&#x…