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);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手入门Jenkins自动化部署入门详细教程

1. 背景 在实际开发中&#xff0c;我们经常要一边开发一边测试&#xff0c;当然这里说的测试并不是程序员对自己代码的单元测试&#xff0c;而是同组程序员将代码提交后&#xff0c;由测试人员测试&#xff1b; 或者前后端分离后&#xff0c;经常会修改接口&#xff0c;然后重新…

为什么vscode访问谷歌浏览器是显示白色????

1、我的代码没有错误: 2、访问谷歌浏览器就显示白色&#xff1f;&#xff1f;&#xff1f;是什么情况

教资学习笔记总结

科目一 科目二 第一章 教育基础知识和基本原理 第一节 教育的认识 1.教育的概念 教育的词源&#xff1a;教育一词最早出现于《孟子尽心上》&#xff1a;“得天下英才而教育之”许慎在《说文解字》中最早解释教育&#xff1a;“教&#xff0c;上所施&#xff0c;下所效也”…

小米平板6将推14英寸版!与MIX Fold 3同步推出

今天&#xff0c;知名数码博主数码闲聊站爆料消息&#xff0c;称小米平板6将推出一款Max版本&#xff0c;预计与小米MIX Fold 3同步推出。 据介绍&#xff0c;小米平板6 Max将是小米首款14英寸大屏的旗舰平板&#xff0c;平板搭载骁龙8处理器&#xff0c;在性能释放、影音表现、…

C# Blazor 学习笔记(11):路由跳转和信息传值

文章目录 前言路由跳转测试用例路由传参/路由约束 前言 Blazor对路由跳转进行了封装。 ASP.NET Core Blazor 路由和导航 NavigationManager 类 本文的主要内容就是全局的跳转 路由跳转 路由跳转就要用到NavigationManager 类。 其实最常用的还是NavigateTo这个跳转函数 测…

TCP的三次握手四次挥手

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥手&a…

8 网络通信(下)

文章目录 wireshark 抓包工具的快速入门TCP/IP 协议详解TCP/IP 协议概述部分协议补充 OSI 参考模型及 TCP/IP 参考模型以太网帧格式ARP 数据报格式IP 段格式ICMP 协议TCP协议UDP 协议MTU和MSS补充 产品模式【C/S B/S】C/S 模式B/S 模式 DDOS简单介绍&#xff08;SYN Flooding&a…

基于SpringBoot+Vue的漫画网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

ORB-SLAM2学习笔记6之D435i双目IR相机运行ROS版ORB-SLAM2并发布位姿pose的rostopic

文章目录 0 引言1 D435i相机配置2 新增发布双目位姿功能2.1 新增d435i_stereo.cc代码2.2 修改CMakeLists.txt2.3 新增配置文件D435i.yaml 3 编译运行和结果3.1 编译运行3.2 结果3.3 可能出现的问题 0 引言 ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地&#xff0c…

干翻Dubbo系列第八篇:Dubbo直连开发核心三要素概述

文章目录 文章说明 一&#xff1a;Dubbo直连开发概念 1&#xff1a;直连设计中的核心组件 (一)&#xff1a;Provider服务的提供者 (二): Consumer服务的访问者 (三)&#xff1a;网络通信明白图 文章说明 本文内容整理自《孙哥说Dubbo系列视频课程》&#xff0c;孙帅老师…

在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:修改sdf、urdf模型

目录 一、问题描述&#xff1a; 二、解决方法&#xff1a; 2.1 SDF模型&#xff1a; 2.2 URDF模型&#xff1a; 2.3 测试添加模型 三、通过Python程序在Gazebo中添加模型 一、问题描述&#xff1a; 在使用ros做仿真实验时&#xff0c;有时会需要在空间中添加一个模型文件…

Arthas协助MQ消费性能优化

背景 项目中使用AWS的SQS消息队列进行异步处理&#xff0c;QA通过压测发现单机TPS在23左右&#xff0c;目标性能在500TPS&#xff0c;所以需要对消费逻辑进行优化&#xff0c;提升消费速度。 目标 消费TPS从23提升到500 优化流程 优化的思路是先分析定位性能瓶颈&#xff…

【云存储】使用OSS快速搭建个人网盘教程(阿里云)

使用OSS快速搭建个人网盘 一、基础概要1. 主要的存储类型1.1 块存储1.2 文件存储1.3 对象存储 2. 对象存储OSS2.1 存储空间2.2 地域2.3 对象2.4 读写权限2.5 访问域名&#xff08;Endpoint&#xff09;2.6 访问密钥2.7 常用功能&#xff08;1&#xff09;创建存储空间&#xff…

根据省市区名字发送请求

思路 选择对应的区域其实是按照表格中的省市区的名字进行匹配 读取文件后对应的字典为&#xff1a; {台湾: {},新疆: {},港澳: {中国澳门: [凼仔岛, nan]},西藏: {昌都地区: [卡若区], 那曲地区: [nan]} } 字典解释例如 市区为空&#xff0c;就是选择省下面的全部市和区 区为空…

OA会议管理系统之我的审批(审批签字可生成图片)

目录 一、前言 1.导读 二、我的审批功能实现 1.功能介绍及分析 2.功能实现 2.1.Dao层 2.2.JSP层 2.3.Web层 3.案例演示 一、前言 1.导读 OA会议管理系统之我的会议&#xff08;会议排座&可拖拽座位&附源码&#xff09;http://t.csdn.cn/iVLAD 书接上…

Linux文件管理知识:查找文件

前几篇文章一一介绍了LINUX进程管理控制命令及网络层面的知识体系&#xff0c;综所周知&#xff0c;一个linux系统是由很多文件组成的&#xff0c;那么既然有那么多文件&#xff0c;那我们该如何管理这些文件呢&#xff1f; Linux中的所有数据都是以文件形式存在的&#xff0c…

飞凌嵌入式「国产」平台大盘点(一)瑞芯微系列

“国产化”一词正在被越来越多的提及&#xff0c;有着越来越高的关注度&#xff0c;飞凌嵌入式也已与多家国内芯片原厂联合推出了数款国产化智能平台。为了帮助大家快速认识飞凌嵌入式推出的各系列国产核心板产品&#xff0c;小编将以芯片品牌进行分类带大家一起盘点。 本篇文…

关于时间的基本概念

年的标准——纪元 Era Epoch 在中国古代&#xff0c; 皇帝会订立年号来纪年&#xff0c; 比如贞观就是唐太宗订立的年号&#xff0c; 于是天下使用贞观元年&#xff0c;贞观二年的方式来纪年。皇帝可以因为各种原因更换年号&#xff0c;比如武则天在位21年&#xff0c; 使用了…

PROFINET转TCP/IP网关profinet网线接头接法

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;捷米JM-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…

2.3 网络安全协议

数据参考&#xff1a;CISP官方 目录 OSI七层模型TCP/IP体系架构TCP/IP安全架构 一、OSI七层模型 简介 开放系统互连模型&#xff08;Open System Interconnection Reference Model&#xff0c;OSI&#xff09;是国际标准化组织&#xff08;ISO&#xff09;于1977年发布的…