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、文件上传-【源码流程…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...