利用 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纯小白入门 两数相加
万事开头难,最怕第一次。使用matlab APP 实现两数求和,如下图所示,c a b,输入数字后,按 “” 就计算。 步骤 拖拽三个 Edit Field(Numeric) 过来,并且双击名字分别改为 a,b,c。注意修改名字后右边会有点变…...

ubuntu右上角的网络连接图标消失解决办法
ubuntu更新了几个文件后,我的ubuntu系统右上角的网络连接图标就消失了,然后怎么也找不到了,怎么办呢? 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 等处理器,谈谈 FPGA 具有哪些优势4、简述 Verilog 语句中阻塞赋值与非阻塞赋值的含义与区别,以及各自的适用的场景5、什么是同步电路,什么…...

【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 选择排序思想 先把最小的元素拿出来 剩下的,再把最小的拿出来 剩下的,再把最小的拿出来 但是这样 空间复杂度是O(n) 优化一下,希望原地排序 1.1.2 选择原地排序 索引i指向0的位置 索引j指向i1的元素 j 后面的元素遍历&…...

Gin学习记录4——Controller和中间件
一. Controller 用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用: package adminimport ("net/http""git…...

FL Studio21.2中文版数字音乐制作软件
现在的FL也可以像splice一样啦,需要什么样的声音只需在fl里搜索,就会自动展示给你! FL Studio 简称FL,全称:Fruity Loops Studio,国人习惯叫它"水果"。软件现有版本是 FL Studio 21,已全面升级支…...

ELK 企业级日志分析系统 ELFK
目录 一、概述 二、组件介绍 2.1、ElasticSearch 2.2、Kiabana 2.3、Logstash 2.4、可以添加的其它组件:Filebeat 2.5、缓存/消息队列(redis、kafka、RabbitMQ等) 2.6、Fluentd 三、ELK工作原理 四、实例演示 1.ELK之 部署"E&q…...

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

源码:TMS FlexCel Studio for .NET 7.19
TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成,适用于 .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从一个特定主存地址开始取指令,执行ROM中的引导程序(先进行硬件自检,再开机)②将磁盘的第一块:主引导记录读入内存,执行磁盘引导程序,扫描分区表③从活动分区(又称主…...

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

strtok()函数的使用方法
strtok() 函数用于将字符串分割成子字符串(标记)。它在 C 语言中非常常用,可以通过指定分隔符来拆分原始字符串,并依次返回每个子字符串。 以下是 strtok() 函数的使用方法: #include <stdio.h> #include <…...
Matlab中的handle 类
目录 说明 类属性 方法 公共方法 事件 示例 从 handle 派生类 说明 handle 类是遵守句柄语义的所有类的超类。句柄是引用 handle 类的对象的变量。多个变量可以引用同一个对象。 handle 类是抽象类,这样无法直接创建该类的实例。使用 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 {…...

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

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...