当前位置: 首页 > 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;欢迎…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...