QT--day6(人脸识别、图像处理)

人脸识别:
/***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QWidget>
#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>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>
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_faceStudyBtn_clicked();private:Ui::Widget *ui;/***********************第一模块:摄像头展示相关成员**************************///定义视频流对象VideoCapture v;//定义图像容器Mat src; //存储原色图Mat gray; //存储灰度图Mat dst; //存储均衡化图像Mat rgb; //存储转化成的rgb图//定义级联分类器类CascadeClassifier c; //该类用于使用模型进行相关区域分类工作//定义存储人脸矩形框的数组vector<Rect>faces;//定义展示摄像头的定时器int camera_timer_id;//重写定时器事件处理函数void timerEvent(QTimerEvent *e);/***********************第二模块:人脸录入相关成员****************************/Ptr<LBPHFaceRecognizer> recognizer; //人脸识别的指针vector<Mat>study_faces; //训练人脸的人脸容器vector<int>study_lab; //记录要存储人脸的id标签int count; //记录机器学习的次数int flag; //记录是否正在录入人脸int study_timer_id; //人脸录入的定时器/**********************第三模块:人脸检测*************************************/int check_timer_id;};#endif // WIDGET_H/*******************************************************************源文件***************************************************************************************************************************/#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//打开摄像头if(!v.open(0)){QMessageBox::information(this,"","摄像头打开失败");return;}//加栽级联分类器if(!c.load("D:\\opencv\\resource\\haarcascade_frontalface_alt2.xml")){QMessageBox::information(NULL,"","级联分类器加载失败");return ;}//给人脸识别区空间QFile file("D:\\opencv\\resource\\myface.xml");//判断人脸模型是否存在if(file.exists()){//判断人脸模型是否存在recognizer=FaceRecognizer::load<LBPHFaceRecognizer>("D:\\opencv\\resource\\myface.xml");}else{//此时表明人脸模型不存在,需要创建出一个人脸模型recognizer=LBPHFaceRecognizer::create(); //调用静态成员函数,创建出一个人脸模型}//初始时将登录按钮设置成不可用状态,当人脸识别成功后,该按钮设置层可用状态ui->loginBtn->setEnabled(false);//启动人脸预测的定时器check_timer_id=startTimer(3000);//程序运行时应处于检测过程而不是学习过程flag=1;//设置可信度recognizer->setThreshold(100); //后期识别后,如果可信度低于100,则说明识别成功}Widget::~Widget()
{delete ui;
}//定时器事件处理函数
void Widget::timerEvent(QTimerEvent *e)
{if(e->timerId()==camera_timer_id) //说明展示摄像头的定时器到位,处理摄像头的功能{//从视频流中读取一张图像放入src中v.read (src);//镜像处理flip(src, src, 1);//色彩空间转化,将bgr图转化为rgb图cvtColor(src,rgb,CV_BGR2RGB);//将图像重新设置大小cv::resize(rgb,rgb,Size(300,300));//灰度处理cvtColor(rgb,gray,CV_BGR2GRAY);//均衡化处理equalizeHist(gray,dst);//获得人脸矩形框c.detectMultiScale(dst,faces);//将人脸矩形区域绘制到rgb图上for(int i=0;i<faces.size();i++){rectangle(rgb,faces[i],Scalar(255,0,0),2);}//使用rgb图构造出一个qt能够识别的图像//QImage (const uchar *data,int width,int height,int bytesPerLine,Format format;//功能:构造一个QImage图//参数1:其他图像的数据域//参数2:其他图像的宽度//参数3:其他图像的高度//参数4:一行内的字节数//参数5:图像格式QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);//在ui界面中展示构造出来的图像ui->cameraLab->setPixmap(QPixmap::fromImage(img));}//判断是否是人脸录入定时器到位if(e->timerId()==study_timer_id){qDebug()<<"正在录入,请稍后...";//获取ui界面中的矩形框框起来的人脸区域Mat face; //要存储的人脸//判断人脸矩形框是否存在if(faces.empty())return ; //如果ui界面上人脸矩形框不存在,则直接结束//从摄像头原图中截取一个矩形框大小的图像放到face变量中face=src(faces[0]);//将该脸进行重新设置大小cv::resize(face,face,Size(50,50));//色彩空间转换cvtColor(face,face,CV_BGR2GRAY);//均衡化处理equalizeHist(face,face);//此时,要存储的脸已经准备好了,需要使用人脸识别器进行更新模型操作//将刚学习的这张脸放入学习容器中study_faces.push_back(face);study_lab.push_back(1);count++; //表明己经学习了一张人脸if(count==50) //需要学习50次,完成人脸模型的配置{recognizer->update(study_faces,study_lab);//完成人脸模型的更新,将图像模型转化为数据模型//将刚刚生成的人脸数据模型,保存到本地磁盘文件中recognizer->save("D:\\opencv\\resource\\myface.xml");//殿后工作QMessageBox::information(this,"","录入成功");flag=1; //表明可以进行人脸检测工作ui->faceStudyBtn->setEnabled(true);//按钮设置成可用状态study_faces.clear();study_lab.clear(); //清空两个容器count=0; //清空计数器,以便下次使用killTimer(study_timer_id);//关闭人脸录入的定时器}}//判断是否是人脸识别定时器到位if(e->timerId()==check_timer_id){//判断是否可以进行检测if(flag==1){qDebug()<<"正在寻找...";//找到人脸模型QFile file("D:\\opencv\\resource\\myface.xml");if(file.exists()) //在人脸模型存在的基础上进行识别{//继续判断当前摄像头中是否有人脸存在if(faces.empty()||recognizer.empty())return; //表明没有人脸或人脸识别器不存在//开始进行人脸识别工作//1、获取摄像头中的人脸区域Mat face=src(faces[0]);//2.重新设置大小,为存储时的大小cv::resize(face,face,Size(50,50));//3.灰度处理和均衡化处理cvtColor(face,face,CV_BGR2GRAY);equalizeHist(face,face);//定义变量存储人脸预测后的结果int lab=-1; //预测后的人脸编号double conf=0.0; //预测后的人脸可信度//5、进行人脸预测工作//函数原型: void predict (InputArray src,cv_our int &label,cv_our double &confidence) const;//功能:对给定的图像进行预测工作//参数1:要预测的图像//参数2:预测后的该图像的编号,如果识别失败,则编号保持之前的不变,如果预测成功,则将该图像对应的编号返回//参数3:人脸识别后的可信度recognizer->predict(face,lab,conf);qDebug()<<"lab="<<lab<<" conf="<<conf;//对人脸识别后的数据进行判断if(lab!=-1){//说明人脸识别成功ui->loginBtn->setEnabled(true);}}}}}//打开摄像头按钮对应的槽函数
void Widget::on_opencameraBtn_clicked()
{//启动打开摄像头的定时器camera_timer_id=startTimer(20);
}//关闭摄像头按钮对应的槽函数
void Widget::on_closecameraBtn_clicked()
{//关闭摄像头的定时器killTimer(camera_timer_id);
}//录入人脸按钮对应的槽函数
void Widget::on_faceStudyBtn_clicked()
{qDebug()<<"开始录入人脸,请正视摄像头...";flag=0; //0表示正在录入人脸,不要进行检测工作count=0; //将学习次数清零//启动录入人脸的定时器study_timer_id=startTimer(50); //每隔50毫秒学习一次//将录入按钮设置成不可用状态ui->faceStudyBtn->setEnabled(false);}
相关文章:
QT--day6(人脸识别、图像处理)
人脸识别: /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...
深度学习:常用优化器Optimizer简介
深度学习:常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降,但往往深度学习的训练集规模很大,计算整个训练集的梯度需要很大…...
【算法心得】二维dp的状态转移狂练
LCS: LCS变式:使两个字符串变成一样的,删除的和最小 https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/ 建表 m ∗ n m*n m∗n or ( m 1 ) ∗ ( n 1 ) (m1)*(n1) (m1)∗(n1)? 感觉 ( m 1 ) ∗ ( n …...
JMeter常用内置对象:vars、ctx、prev
在前文 Beanshell Sampler 与 Beanshell 断言 中,初步阐述了JMeter beanshell的使用,接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注:示例使用JMeter版本为5.1 1. vars 如 API 文档 所言,这是定义变量的类&a…...
【C++从0到王者】第十四站:list基本使用及其介绍
文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示,是库里面对list的基本…...
正则表达式、常用的正则
文章目录 正则表达式字符含意义RegExp函数RegExp属性RegExp对象方法RegExp构造函数的第二个参数 常用的正则例子只包含数字(包括正数、负数、零)只包含中英文数字及键盘上的特殊字符校验密码是否符合规则的正则校验http或者https端口号的正则只校验端口号…...
ST官方基于米尔STM32MP135开发板培训课程(一)
本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例,讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载: https://www.st.com/en/embedded-software/stm32mp1dev.ht…...
组件(lvs,keeplive,orm,mysql,分布式事务)
lvs LVS 已经集成到Linux内核系统中,ipvsadm 是 LVS 的命令行管理工具。 目前有三种 IP 负载均衡技术( VS/NAT 网络地址转换 、VS/TUN IP 隧道技术实现虚拟服务器 和 VS/DR 直接路由); 八种调度算法:轮询 …...
《视觉SLAM十四讲》报错信息和解决方案
文章目录 ch4-Sophus编译报错ch5/imageBasics安装opencv4.x报错ch5/joinMap/CMakeLists.txt编译报错ch5/joinMap-pcl_viewer map.pcd报错 ch4-Sophus编译报错 报错信息: error: lvalue required as left operand of assignmentunit_complex_.real() 1.;^~ error:…...
golang 设置http请求代理
tinypoxy 搭建http代理服务可参考:tinyproxy搭建http代理_wangxiaoangg的博客-CSDN博客 需求背景: 项目需要访问一国外服务接口,地址被墙。购买香港ecs服务器,并在上面搭建http代理服务。 一 使用http和https代理 func main() {pr…...
我的会议(会议通知)
前言: 我们在实现了发布会议功能,我的会议功能的基础上,继续来实现会议通知的功能。 4.1实现的特色功能: 当有会议要参加时,通过查询会议通知可以知道会议的内容,以及当前会议状态(未读) 4.2思路…...
css实现水平居中
代码示例 <div class"box"><div class"box1"></div> </div>1.弹性布局:(推荐) display:flex; 这些要添加在父级的,是父级的属性 //父级添加display:flex; //父级添加jus…...
c刷题(一)
目录 1.输出100以内3的倍数 2.将3个数从大到小输出 3.打印100~200素数 方法一 方法二 4.显示printf的返回值 最大公约数 试除法 辗转相除法 九九乘法表 求十个数的最大值 1.输出100以内3的倍数 法一: int n 0; while (n*3 < 100){printf("%d &q…...
webpack
文章目录 webpack概念打包的场景为什么要打包在打包之外 - 翻译在打包之外 - 小动作 课程重点模块化利用立即执行函数来改变 作用域模块化的优点模块化方案的进化史AMD(成型比较早,应用不是很广泛)COMMONJSES6 MODULE webpack 的打包机制webp…...
反复 Failed to connect to github.com port 443 after xxx ms
前提:使用了代理,浏览器能稳定访问github,但git clone一直超时 解决方案: 1. git config --global http.proxy http://127.0.0.1:1080 2. 代理设置端口1080 3. 1080可自定义 感谢来自这篇博客和评论区的提醒:解决…...
ARM裸机-11
1、安装交叉编译工具工具 1.1、windows中装软件的特点 windows中装软件使用安装包,安装包解压后有两种情况:一种是一个安装文件 (.exe/.msi),双击进行安装,下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式,我们平时使用快…...
centos7升级glibc
作者:吴业亮 博客:wuyeliang.blog.csdn.net 安装bison: yum install bison -y安装wget、bzip2、gcc、gcc-c和glibc-headers: yum -y install wget bzip2 gcc gcc-c glibc-headers安装make-4.2.1: wget http://ftp.…...
【OnnxRuntime】在linux下编译并安装C++版本的onnx-runtime
目录 安装C接口的onnx-runtime安装依赖项:下载源文件构建ONNX Runtime安装ONNX Runtime 安装C接口的onnx-runtime 安装依赖项: 安装CMake:可以通过包管理器(如apt、yum等)安装CMake。 安装C编译器:确保系…...
C#基于OpenCv(OpenCvSharp) 的 fftshift, ifftshift 函数的实现
本文实现基于OpenCv(OpenCvSharp) 的 fftshift, ifftshift 函数。 fftshift 函数将信号频谱的零频分量移动到数组中心, 本质是分别对调一三象限数据。 ifftshift完成相反的操作,本质是二四象限的数据块。 OpenCV中没有这两个函数如果使用需要自己实现。 实现代码如下: …...
【SpringBoot】笔记2
文章目录 45、web实验-抽取公共页面46、web实验-遍历数据与页面bug修改47、视图解析-【源码分析】-视图解析器与视图[暂时没看]48、拦截器-登录检查与静态资源放行49、拦截器-【源码分析】-拦截器的执行时机和原理50、文件上传-单文件与多文件上传的使用51、文件上传-【源码流程…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
