当前位置: 首页 > news >正文

利用 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();
}

相关文章:

利用 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.hFOR…...

MATLAB APP纯小白入门 两数相加

万事开头难&#xff0c;最怕第一次。使用matlab APP 实现两数求和&#xff0c;如下图所示&#xff0c;c a b&#xff0c;输入数字后&#xff0c;按 “” 就计算。 步骤 拖拽三个 Edit Field(Numeric) 过来&#xff0c;并且双击名字分别改为 a,b,c。注意修改名字后右边会有点变…...

ubuntu右上角的网络连接图标消失解决办法

ubuntu更新了几个文件后&#xff0c;我的ubuntu系统右上角的网络连接图标就消失了&#xff0c;然后怎么也找不到了&#xff0c;怎么办呢&#xff1f; 1、按快捷键ctrlaltt打开终端 2、按以下顺序输入如下的命令行 sudo service network-manager stop sudo rm /var/lib/Netw…...

conda创建虚拟环境安装aix360

目录 创建虚拟环境查看已有虚拟环境进入所创建的虚拟环境查看已安装的程序查看已安装的python模块配置镜像pipconda 安装aix360将环境添加到jupyter删除虚拟环境 创建虚拟环境 conda create -n aix360 python3.9查看已有虚拟环境 conda env list进入所创建的虚拟环境 activa…...

CentOS安装mariadb

1、 安装 [rootlocalhost ~]# yum install mariadb mariadb-server2、 启动并自启 [rootecs-3f21 ~]# systemctl enable mariadb –now3、 查看启动状态 [rootecs-3f21 ~]# systemctl status mariadb4、 初始化mariadb并设置root密码 [rootecs-3f21 ~]# mysql_secure_inst…...

FPGA——基础知识合集

文章目录 前言1、简述触发器与锁存器的区别2、简述 if-else 语句和 case 语句的区别3、相对 ARM、DSP 等处理器&#xff0c;谈谈 FPGA 具有哪些优势4、简述 Verilog 语句中阻塞赋值与非阻塞赋值的含义与区别&#xff0c;以及各自的适用的场景5、什么是同步电路&#xff0c;什么…...

【pytest】 标记冒烟用例 @pytest.mark.smoke

1. 使用 pytest.mark.smoke 标记用例 import pytest class Test_Smoke:def test_01(self):assert 112pytest.mark.smokedef test_02(self):assert 121pytest.mark.smokedef test_03(self):assert 1 2 3 2.配置文件pytest.ini [pytest] markers smoke 3. 运行指定标签 运…...

数据结构入门-14-排序

一、选择排序 1.1 选择排序思想 先把最小的元素拿出来 剩下的&#xff0c;再把最小的拿出来 剩下的&#xff0c;再把最小的拿出来 但是这样 空间复杂度是O(n) 优化一下&#xff0c;希望原地排序 1.1.2 选择原地排序 索引i指向0的位置 索引j指向i1的元素 j 后面的元素遍历&…...

Gin学习记录4——Controller和中间件

一. Controller 用不同的Controller可以实现业务的分类&#xff0c;不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装&#xff0c;直接将ctrl的代码写入到一个文件里然后调用&#xff1a; package adminimport ("net/http""git…...

FL Studio21.2中文版数字音乐制作软件

现在的FL也可以像splice一样啦&#xff0c;需要什么样的声音只需在fl里搜索&#xff0c;就会自动展示给你! FL Studio 简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;国人习惯叫它"水果"。软件现有版本是 FL Studio 21&#xff0c;已全面升级支…...

ELK 企业级日志分析系统 ELFK

目录 一、概述 二、组件介绍 2.1、ElasticSearch 2.2、Kiabana 2.3、Logstash 2.4、可以添加的其它组件&#xff1a;Filebeat 2.5、缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 2.6、Fluentd 三、ELK工作原理 四、实例演示 1.ELK之 部署"E&q…...

IDEA中创建Java Web项目方法1

以下过程使用IntelliJ IDEA 2021.3 一、File-> New -> Project... 1. 项目类型中选择 Java Enterprise 项目 2. Name&#xff1a;填写自己的项目名称 3. Project template&#xff1a;选择项目的模板&#xff0c;Web application。支持JSP和Servlet的项目 4. Applica…...

源码:TMS FlexCel Studio for .NET 7.19

TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成&#xff0c;适用于 .NET、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Windows Phone 和 Windows Store 功能概述 使用 FlexCel Studio for .NET 创建可动态快速读写 Excel 文件的…...

多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出

多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出 目录 多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现PSO-BP粒子群优化BP神经网络多输入多输出预测 1.data为数据…...

操作系统:系统引导以及虚拟机

1.操作系统引导的过程 ①CPU从一个特定主存地址开始取指令&#xff0c;执行ROM中的引导程序&#xff08;先进行硬件自检&#xff0c;再开机)②将磁盘的第一块&#xff1a;主引导记录读入内存&#xff0c;执行磁盘引导程序&#xff0c;扫描分区表③从活动分区&#xff08;又称主…...

AIGC绘本——海马搬家来喽

随着ChatGPT的快速发展&#xff0c;人工智能领域也发生了翻天覆地的变化。今天&#xff0c;我们迎合科技潮流&#xff0c;利用AIGC的强大能力&#xff0c;可以创作很多精彩的作品&#xff0c;比如这样一本名为《海马搬家》的绘本&#xff08;注&#xff1a;此绘本根据同名儿童故…...

strtok()函数的使用方法

strtok() 函数用于将字符串分割成子字符串&#xff08;标记&#xff09;。它在 C 语言中非常常用&#xff0c;可以通过指定分隔符来拆分原始字符串&#xff0c;并依次返回每个子字符串。 以下是 strtok() 函数的使用方法&#xff1a; #include <stdio.h> #include <…...

Matlab中的handle 类

目录 说明 类属性 方法 公共方法 事件 示例 从 handle 派生类 说明 ​ handle 类是遵守句柄语义的所有类的超类。句柄是引用 handle 类的对象的变量。多个变量可以引用同一个对象。 handle 类是抽象类&#xff0c;这样无法直接创建该类的实例。使用 handle 类派…...

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 {…...

软件项目测试用例评审

软件项目测试用例评审是确保测试计划的一部分&#xff08;即测试用例&#xff09;满足项目质量和要求的关键步骤之一。以下是一个通用的软件项目测试用例评审流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...