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、文件上传-【源码流程…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
