day6Qt作业

news2024/11/17 22:28:47

人脸识别系统

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

 

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

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

相关文章

r语言数据分析案例-北京市气温预测分析与研究

一、选题背景 近年来&#xff0c;人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放&#xff0c;大量温室气体强烈吸收地面辐射中的红外线&#xff0c;造 成温室效应不断累积&#xff0c;使得地球温度上升&#xff0c;造成全球气候变暖。 气象温度的预测一直以来都是…

【Java orm 框架比较】十一 新增 原生jdbc对比

迁移到&#xff08;https://gitee.com/wujiawei1207537021/spring-orm-integration-compare&#xff09; orm框架使用性能比较 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc…

OpenCV | 入门

OpenCV | 入门 安装 参考教程 基础知识 V G A 640 480 VGA 640 \times 480 VGA640480 H D 1280 720 HD 1280 \times 720 HD1280720 F H D 1920 1080 FHD 1920 \times 1080 FHD19201080 4 K 3840 2160 4K 3840 \times 2160 4K38402160 这些都表示了固定的像素…

怎样的跨网软件,可以实现网间数据的安全收发?

网络隔离已是较为常见的网络安全保护措施&#xff0c;比如防火墙、网闸、VLAN&#xff0c;云桌面虚拟环境等方面进行隔离。像一些科技研发型企业&#xff0c;不仅仅是内外网隔离&#xff0c;甚至还划分办公网、研发网、测试网、生产网等&#xff0c;防止研发资料、设计资料等敏…

Windows Nginx 服务器部署并推流

环境 开发环境&#xff1a;windows 开发工具&#xff1a;ffmpeg、nginx、nginx-rmtp-module、vlc media player Nginx Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;并且支持rtmp&#xff0c;不过rtmp是作为一个nginx的一个模块。 对于linux系统&#xff0c;需要另…

使用Selenium破解滑动验证码的原理及解决思路

1、获取页面元素信息&#xff1a; 使用Selenium打开目标网页&#xff0c;并通过相关方法获取滑块、背景图等元素的位置和属性信息。可以使用Selenium提供的定位方法&#xff08;如xpath、CSS选择器等&#xff09;来找到这些元素。 可以使用find_element_by_xpath或find_elemen…

673. 最长递增子序列的个数(Leetcode)

文章目录 前言一、题目描述二、解题步骤1.小demo介绍2.动态规划1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值 三、代码编写总结 前言 在本篇文章中&#xff0c;我们将会讲到leetcode中673. 最长递增子序列的个数&#xff0c;我们将会用动态规划方式解决这道问题&#…

weditor安装的时候产生的问题

先放出来github的地址https://github.com/alibaba/web-editor&#xff0c;这个上面给了两种安装方式一种是&#xff1a; pip3 install -U weditor 这种方式会报错误&#xff0c; 具体原因我也不知道。那就采用第二种方式 git clone https://github.com/openatx/weditor pip3…

实体同城商家短视频获客,3天直播课,玩转实体商家私域,引爆门店增长

课程内容&#xff1a; 实体同城3天直播课【资料】 实体商家获客第一天 .mp4 实体商家获客第二天上.mp4 实体商家获客第二天,mp4 实体商家获客第三天.mp4 实体商家获客第4天.mp4 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x…

【Linux】从零开始认识动静态库 -动态库

送给大家一句话&#xff1a; 我不要你风生虎啸&#xff0c; 我愿你老来无事饱加餐。 – 梁实秋 《我把活着欢喜过了》 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭…

数据结构与算法学习笔记三---队列的链式存储表示和实现(C++)

目录 前言 1.队列的概念 2.队列的表示和实现 1.定义 2.初始化 ​编辑 3.销毁队列 4.清空队列 5.队列判空 6.队列长度 7.获取队头元素 8.入队 9.出队 10.遍历 11.完整代码 前言 这篇博客主要讲的是对队列的链式存储。 1.队列的概念 队列是一种访问受限的线性表。…

如何将一个VPS上的网站全部迁移至另外一个VPS服务器

最近我们老的VPS即将到期&#xff0c;由于近期Hostease的VPS活动力度较大&#xff0c;我们购买了Hostease的VPS&#xff0c;购买后需要将原服务器的所有网站迁移到Hostease提供的VPS中。在Hostease技术人员的帮助下&#xff0c;我们成功进行了迁移&#xff0c;下面我就介绍此次…

酷开科技丨母亲节,别让有爱瞬间轻易溜走

在母亲节这个充满温情的节日里&#xff0c;酷开科技以“健健康康才能长长久久”为主题&#xff0c;推出了一系列关怀活动&#xff0c;旨在通过科技的力量&#xff0c;提升母亲们的身体素质和生活质量&#xff0c;同时也为儿女们提供了表达孝心和关怀的机会。 酷开系统特别上线…

域基础-NTLM协议

简介 NTLM(New Technology LAN Manager)协议是微软用于Windows身份验证的主要协议之一。继SMB、LM协议之后微软提出了NTLM协议&#xff0c;这一协议安全性更高&#xff0c;不仅可以用于工作组中的机器身份验证&#xff0c;又可以用于域环境身份验证&#xff0c;还可以为SMB、H…

深入解析RedisSearch:全文搜索的新维度

码到三十五 &#xff1a; 个人主页 在当今的数据时代&#xff0c;信息的检索与快速定位变得尤为关键。Redis&#xff0c;作为一个高性能的内存数据库&#xff0c;已经在缓存和消息系统中占据了重要地位。然而&#xff0c;Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

文章目录 问题概述分析问题解决问题查看交换分区创建交换分区删除交换分区调整交换分区的活跃度 问题概述 开发SystemUI时&#xff0c;使用内存为16G的主机&#xff0c;Ubuntu 20.04的系统编译SystemUI的源码&#xff0c;编译的过程中发现电脑卡顿&#xff0c;鼠标不能移动。必…

渗透思考题

一&#xff0c;尝试登录。 客户端对密码进行哈希处理并缓存密码hash&#xff0c;丢弃实际的明文密码&#xff0c;然后将用户名发送到服务器&#xff0c;发起认证请求 密文存储位置&#xff1a;数据库文件位于C:WindowsSystem32configsam&#xff0c;同时挂载在注册表中的HKLMSA…

台阶仪测量膜厚原理及优势

台阶仪&#xff0c;也称为探针式轮廓仪或接触式表面轮廓测量仪&#xff0c;主要用于台阶高、膜层厚度、表面粗糙度等微观形貌参数的测量。 台阶仪的工作原理 台阶仪的核心部件是一个精密的触针或探针&#xff0c;它被安装在一个高度可调的支架上。当触针沿被测表面轻轻滑过时…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

ACM实训冲刺第四天

【碎碎念】最近的任务有点繁重&#xff0c;所以考虑到实际情况&#xff0c;视频学习决定放置一段时间&#xff0c;重点是学校的实训练习题&#xff0c;对于我而言&#xff0c;目标不是优秀/良好&#xff0c;综合考虑我的实际情况&#xff0c;保佑我及格、顺利通过就可&#xff…