day6Qt作业

人脸识别系统

#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>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>
using namespace  cv;
using namespace cv::face;
using namespace std;QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_opencamerabtn_clicked();void timerEvent(QTimerEvent *event)override;void on_cameraclosebtn_clicked();void on_faceinbtn_clicked();void on_facerecbtn_clicked();private:Ui::Widget *ui;Mat src;Mat grey;Mat dest;Mat rgb;//存放转变后的RGB图VideoCapture video;CascadeClassifier c;vector<Rect> myface; //人脸矩形容器int camera_timer_d; //关于ui界面展示图片的定时器Ptr<LBPHFaceRecognizer> recognizer;//人脸识别器指针vector<Mat> train_faces;//人脸训练容器vector<int> train_labs;//人脸编号   容器int count=0;//人脸识别次数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(!video.open(0)){QMessageBox::information(this,"提示","摄像头打开失败");return;}if(!c.load("D:\\opencv\\resources\\haarcascade_frontalface_alt.xml")){QMessageBox::information(this,"提示","级联分类器下载失败");return;}//给recognizer实意化类对象QFile file("D:\\opencv\\resources\\myface.xml");if(file.exists()){recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("D:\\opencv\\resources\\myface.xml");}else{recognizer = LBPHFaceRecognizer::create();}recognizer->setThreshold(70);//设置模型的阈值
}Widget::~Widget()
{delete ui;
}void Widget::on_opencamerabtn_clicked()
{camera_timer_d = startTimer(20);ui->faceinbtn->setEnabled(true);ui->facerecbtn->setEnabled(true);
}void Widget::timerEvent(QTimerEvent *event)
{if(event->timerId()==camera_timer_d){
//        static int num;
//        ui->cameralab->setNum(num++);
//        if(!video.open(0))
//        {
//            QMessageBox::information(this,"提示","摄像头打开失败");
//            return;
//        }if(!video.read(src)){QMessageBox::information(this,"提示","图像读取错误");return;}flip(src,src,1);//图像翻转cvtColor(src,grey,CV_BGR2GRAY);//灰度图equalizeHist(grey,dest);c.detectMultiScale(dest,myface);for(uint i=0;i<myface.size();i++)//将每张图片{rectangle(src,myface[i],Scalar(0,255,0));}// imshow("test",src);//将图像调整大小cvtColor(src,rgb,CV_BGR2RGB);//Mat类的是BGR图像,转成RGBcv::resize(src,rgb,Size(300,300));//将Mat图像转换为Qt能够识别的图像QImage image=QImage(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);//将图像展示到UI界面上ui->cameralab->setPixmap(QPixmap::fromImage(image));}//判断是否是人链录入定时器是否到位if(event->timerId() == study_timer_id){qDebug() << "人脸录入中,请稍后";//处理人脸录入//用于存储人脸区域图像Mat face;face = src(myface[0]);  //将框中人脸截取//将图像重新设置大小,以便识别与录入图片大小一样cv::resize(face,face,Size(100,100));cvtColor(face,face,CV_BGRA2GRAY);//灰度图equalizeHist(face,face);//均衡化处理//将该图像放入到学习容器中train_faces.push_back((face));train_labs.push_back((1));count++;if(count==30){//使用容器中的数据更新模型recognizer->update(train_faces,train_labs);//将模型保存到本地磁盘recognizer->save("D:\\opencv\\resources\\myface.xml");//处理后续操作count=0; //便于下次人脸录入使用//清空容器train_faces.clear();train_labs.clear();ui->facerecbtn->setEnabled(true);ui->faceinbtn->setEnabled(true);killTimer(study_timer_id);QMessageBox::information(this,"提示","人脸录入成功");//关闭定时器}}//判断是否是人链录入定时器是否到位if(event->timerId() == check_timer_id){//判断图像上是否有矩形框
//        if(myface.empty() || recognizer.empty())
//        {
//            return;
//        }//从摄像头中获取人脸检测矩形区域图像Mat face = src(myface[0]);//重新获取设置大小cv::resize(face,face,Size(100,100));//灰度处理cvtColor(face,face,CV_BGR2GRAY);//均衡化处理equalizeHist(face,face);//定义接受识别后接收结果的变量int lab = -1;double conf = 0;recognizer->predict(face,lab,conf);//参数一 预测图像//参数二 返回的图像编号//参数三 预测可信度qDebug() << lab << conf;//判断人脸预测后的结果,进而执行相关逻辑if(conf <= 100 && lab != -1){
//            qDebug() << lab << conf;QMessageBox::information(this,"提示","欢迎回来");//后续操作killTimer(check_timer_id);//关闭定时器//将两个按钮设置可用状态ui->faceinbtn->setEnabled(true);ui->facerecbtn->setEnabled(true);ui->functionbtn->setEnabled(true);}}}void Widget::on_cameraclosebtn_clicked()
{killTimer(camera_timer_d);ui->cameralab->clear();
}
//录入人脸按钮对应的槽函数
void Widget::on_faceinbtn_clicked()
{study_timer_id = startTimer(50);ui->faceinbtn->setEnabled(false);ui->facerecbtn->setEnabled(false);
}void Widget::on_facerecbtn_clicked()
{//将两个按钮设置成不可用状态ui->faceinbtn->setEnabled(false);ui->faceinbtn->setEnabled(false);check_timer_id=startTimer(30);
}

 

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

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

相关文章

美颜滤镜SDK解决方案,稳定可靠,易于集成

高质量的视觉体验已成为企业吸引用户、提升品牌形象的关键&#xff0c;美摄科技凭借其领先的美颜滤镜SDK技术&#xff0c;为企业提供了从人像美颜到多元场景处理的全方位解决方案&#xff0c;助力企业轻松实现视觉升级。 一、强大能力&#xff0c;覆盖多场景 美摄科技美颜滤镜…

MIPI DPHY HS传输模式SoT和EoT的传输值

目录 1. 高速传输模式的传输序列 2. SoT传输序列 3. EoT传输序列 1. 高速传输模式的传输序列 Mipi DPHY的高速数据传输&#xff08;HST&#xff1a;High Speed Transmission&#xff09;以突发&#xff08;Burst&#xff09;方式发生。 为了帮助接收机同步&#xff1a; (1) …

Vue3实战笔记(13)—pinia安装笔记

文章目录 前言安装和配置pinia总结 前言 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 Pinia是一个轻量级的状态管理库&#xff0c;它专注于提供一个简单的API来管理应用程序的状态。相比之下&#xff0c;Vuex是一个更完整的状态管理库&#xf…

现代制造之数控机床篇

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

【信号与槽机制】

信号与槽机制 &#x1f31f; 信号函数&#x1f31f; 槽函数&#x1f31f; 连接函数&#x1f338; QObejct::connect函数剖析&#x1f31f; 官方文档中给出的定义&#x1f31f;《Qt 5.9 C开发指南》中的定义 &#x1f31f; 信号函数 信号是一种特殊的成员函数&#xff0c;用于在…

2024数维杯数学建模C题思路代码

2024年数维杯&电工杯思路代码在线文档​https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果&#xff0c;必须要结合插值法和分布函数来做&#xff0c;主要还是因为勘探点太少&#xff0c;直接用插值法效果不太好&#xff0c;以下是我做的&#xff0c;函数分布可…

Applied Spatial Statistics(五)线性回归 I

Applied Spatial Statistics&#xff08;五&#xff09;线性回归 I 该笔记本演示了&#xff1a; 线性回归系数估计在假设下是无偏的如何围绕系数估计构建 bootstrap 置信区间残差图Q-Q图 1. 线性回归系数估计在假设下是无偏的 import numpy as np import matplotlib.pyplot…

5分钟速通大语言模型(LLM)的发展与基础知识

✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5; 程序员&#xff1a;职场关键角色通识宝…

N5183B是德科技n5183b信号源

181/2461/8938产品概述&#xff1a; 简  述&#xff1a; N5183B 频率范围&#xff1a;9 kHz 至 20 GHz&#xff0c;具有 AM、FM、相位调制功能。N5183B MXG X 系列微波模拟信号发生器拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;以及接近 PSG 级别的相位噪声性能&…

3588 pwm android12 的操作

问题&#xff1a; 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程&#xff1a; 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是&#xff0c; 还不知道&#xff0c;android12 最终包含的 设备树是哪个&#xff0c;但是经过我的…

ctfshow SSRF 351-358

做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时&#xff0c;它会尝试获取该 URL 指向的资源的内容&#xff0c;并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件&#xff0c;它包含的内容取决于该 PHP 文件…

素数伴侣最大组合数

若两个正数之和为素数&#xff0c;则这两个数称之为“素数伴侣”。利用此特性找出给定数组中最大的“素数伴侣”对数。 (笔记模板由python脚本于2024年05月11日 18:17:40创建&#xff0c;本篇笔记适合熟悉基本编程且了解素数的coder翻阅) 【学习的细节是欢悦的历程】 Python 官…

阿里云ECS服务器实例挂载数据盘步骤(磁盘自动挂载.、访问挂载点)

阿里云ECS服务器实例挂载数据盘步骤 相关指令 df -h 查看磁盘空间 du -sh * 查看使用内存大小1.磁盘自动挂载 首先登录阿里云ECS服务器&#xff0c;通过 df -h 命令查看当前磁盘挂载情况 通过 fdisk -l 命令查看磁盘情况&#xff0c;可以发现有两个盘&#xff1a; 系统盘 …

绍兴ISO27001认证:信息安全认证的金钥匙

&#x1f308;&#x1f308;绍兴ISO27001认证&#xff1a;✌️信息安全认证的金钥匙&#x1f511; &#x1f498;随着信息技术的飞速发展&#xff0c;&#x1f481;信息安全问题日益凸显。&#x1f510;为了提升信息安全管理水平&#xff0c;&#x1f46e;保障企业数据资产安全…

神经网络复习--神经网络算法模型及BP算法

文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式&#xff1a; 神经网络的三要素&#xff1a; 具有突触或连接&#xff0c;用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …

内容检索(2024.05.12)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 信号仿真类话题-…

webpack5基础和配置

初步体验webpack打包 webpack是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口&#xff0c;将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件&#xff0c;就可以在浏览器段运行了。 1.初始化最简单的一个目录文件&#xff…

JavaSE——集合框架一(1/7)-集合体系概述(集合体系结构,Collection集合体系)、Collection的常用方法(介绍,实例演示,代码)

目录 集合体系概述 集合体系结构 Collection集合体系 Collection的常用方法 介绍 实例演示 完整代码 集合体系概述 集合体系结构 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。 为了满足…

# ERROR: node with name “rabbit“ already running on “MS-ITALIJUXHAMJ“ 解决方案

ERROR: node with name “rabbit” already running on “MS-ITALIJUXHAMJ” 解决方案 一、问题描述&#xff1a; 1、启动 rabbitmq-server.bat 服务时&#xff0c;出错 Error 2、查询 rabbitmqctl status 状态时&#xff0c;出错 Error 3、停止 rabbitmqctl stop 服务时&a…

关于画图-一次性搞定各类高级论文作图及配色

关于画图-一次性搞定各类高级论文作图及配色 图&#xff08;Figure&#xff09;可以让各类论文的结果更加直观&#xff0c;有时候一张图片比一大段文字更有说服力。 但许多新手作者可能会有一连串的疑惑&#xff1a;数据这么多&#xff0c;什么时候该做什么类型的图&#xff…