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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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图像,转成RGB
         cv::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);
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步&#xff1a;使用cra脚手架 创建项目 文档地址&#xff1a;Create React App 中文文档 npx create-react-app 你的项目名称 第二步&#xff1a;整理项目结构和删除多余代码 目标效果图&#xff1a; 在src目录下分别新建apis,assets,components,pages,router,store,ut…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

C++初学者,使用命令行编绎C文件

今天在家里&#xff0c;闲来无事。又开始学习制作Helloworld! VStudio 版本众多&#xff0c;用哪个好呢&#xff0c;真是不好选择。今天就使用网上的大神&#xff1a;theoractice&#xff0c;制造的版本来学习C&#xff0c;我喜欢2013这个版本&#xff0c;真是太好用了。不但C…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

【一键录音,轻松转换:用Python打造个性化音频记录工具】

在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…

第十二届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 相乘试题 B: 直线试题 C : \mathrm{C}: C: 货物摆放试题 D: 路径试题 E: 回路计数试题 F : \mathrm{F}: F: 最少砝码试题 G: 左孩子右兄弟试题 H : \mathrm{H}: H: 异或数列试题 I \mathbf{I} I 双向排序试题 J : \mathrm{J}: J: 分…

如何快速展示专业:掌握类的基本概念-类/方法/关键字/变量/数据类型/注释

在李笑来的《财富自由之路》中提到一种初学者快速入门的学习方法&#xff1a;快速掌握最小必要知识。 关于Java的类&#xff0c;最少必要知识就是本文提到的基本概念&#xff0c;掌握了这些基本概念&#xff0c;就对类有了基本的了解&#xff0c;为后续的深入学习和沟通奠定了基…

Go编程语言的调试器Delve | Goland远程连接Linux开发调试(go远程开发)

文章目录 Go编程语言的调试器一、什么是Delve二、delve 安装安装报错cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH解决 三、delve命令行使用delve 常见的调试模式常用调试方法todo调试程序代码与动态库加载程序运行…

真要这么卷?某国产大模型定价下调90%,百万 tokens 只需 1 元!

就在刚刚&#xff0c;国内明星AI公司——智谱AI官宣重磅炸弹&#xff1a; 将能力对标GPT3.5-Turbo的GLM-3的大模型API调用价格最高下调90%&#xff0c;价格仅为原来的十分之一&#xff01; 废话不多说&#xff0c;直接上图&#xff1a; 官网地址&#xff1a;https://open.big…

【SRC实战】前端脱敏信息泄露

挖个洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、前端脱敏&#xff0c;请求包泄露明文 “ 前端脱敏处理&#xff0c;请求包是否存在泄露&#xff1f; ” 1、获取验…

公有云Linux模拟UDP端口并抓包

目录 写在前面操作步骤服务端开启UDP端口并监听客户端连接Wireshark抓包查看 写在前面 关于具体的操作&#xff0c;请参考我的上一篇文章 公有云Linux模拟TCP三次挥手与四次握手&#xff08;Wireshark抓包验证版&#xff09; 在本文&#xff0c;仅介绍与上一篇不同的地方。 操…

STL中的优先级队列

目录 1.引言 2.简介 3.基本操作 4.实现原理 5.自定义优先级比较 6.相关题目 7.能特点 8.总结 1.引言 在C标准库中&#xff0c;优先级队列是一种非常有用的数据结构&#xff0c;它允许我们根据元素的优先级来对其进行排序和访问。这种数据结构在多种应用场景中都发挥着重…

Linux提权--第三方软件MYSQL数据库提权(WEB+本地)

免责声明:本文仅做技术交流与学习,非法搞事后果自负... 目录 靶场镜像: 过程: 手工: 下载mysql udf poc 进行编译. 进入数据库进行UDF导出 下载(上传) 创建do_system函数调用 探针(./LinEnum.sh),查找suid权限. 配合使用find调用执行 工具: 过程: 外连不上? 隧道出…

云器Lakehouse:Multi-Cluster弹性架构如何实现湖上高并发低延迟分析

导读 在当今快速发展的大数据时代&#xff0c;数据平台的性能和效率对于企业来说至关重要。云器Lakehouse的Multi-Cluster弹性架构为我们提供了一种全新的视角&#xff0c;以应对数据湖上高并发和低延迟分析的挑战。本文将深入探讨云器Lakehouse如何通过其独特的技术理念和架构…

B端弹窗设计指南,3000字讲清楚,内附大量案例。

B端系统弹窗是指在企业级&#xff08;Business to Business&#xff09;系统中&#xff0c;弹出的窗口或对话框&#xff0c;用于向用户展示信息、提供操作选项或者收集用户输入。 一、B端系统弹窗的作用 作用如下&#xff1a; 提示和通知&#xff1a;弹窗可以用于向用户展示重…

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发&#xff0c; 当开发完成后&#xff0c;需要把开发的功能部署到测试环境供测试人员进行测试使用&#xff0c; 等测试人员测试通过后&#xff0c;我们会将项目部署到生成环境上线使用。 这个时…

RisingWave基本操作

什么是RisingWave RisingWave 是一款基于 Apache 2.0 协议开源的分布式流数据库。RisingWave 让用户使用操作传统数据库的方式来处理流数据。通过创建实时物化视图&#xff0c;RisingWave 可以让用户轻松编写流计算逻辑&#xff0c;并通过访问物化视图来对流计算结果进行及时、…

Mobilenet四代网络模型架构

一、Mobilenet v1 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文地址:https://arxiv.org/abs/1704.04861https://arxiv.org/abs/1704.04861 1.概述 Mobilenet是一个用于移动端和嵌入式的神经网络,其核心思想是采用深度可分离…

六西格玛遇上AI:质量提升进入“快车道”

人工智能&#xff08;AI&#xff09;与六西格玛管理方法——正在慢慢接近我们的视野中&#xff0c;预示着在质量管理中一场改革重大改革将要到来。 AI&#xff0c;作为科技的前沿&#xff0c;正以其强大的数据处理能力和机器学习能力&#xff0c;为质量管理提供全新的视角。它…

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店&#xff0c;只靠49个男人用一套方法卖白酒…