QT实现人脸识别

QT实现人脸识别

Face.pro文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv2
LIBS += D:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

 widget.h文件:

#ifndef WIDGET_H
#define WIDGET_H

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

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_openBtn_clicked();

    void on_closeBtn_clicked();

    void on_faceBtn_clicked();

private:
    Ui::Widget *ui;

    //=========摄像头相关成员的设置=========
    VideoCapture v; //摄像头容器
    Mat src; //存放  原图  的容器
    Mat gray; //存放  灰度图  的容器
    Mat dst; //存放  直方图  的容器
    Mat rgb; //存放  rgb图  的容器
    CascadeClassifier c; //定义一个级联分类器容器
    vector<Rect> faces; // 定义一个数组存放人脸矩形框
    int camera_id; //打开摄像头的定时器id
    void timerEvent(QTimerEvent *e); //定时器事件  重写函数事件声明

    //=========人脸录入相关成员的设置=========
    Ptr<LBPHFaceRecognizer> recognizer; //人脸  识别器指针
    vector<Mat> study_faces; //定义一个存放录入人脸的数组
    vector<int> study_lables; //定义一个存放人脸对应的标签数组
    int count; //记录录入人脸的次数
    int flag; //用来区别是人脸录入还是人脸识别
    int face_id; // 人脸录入定时器id

    //=========人脸检测相关成员的设置=========
    int check_id; //

};
#endif // WIDGET_H

widget.cpp文件:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->weChatBtn->setEnabled(false);

    //打开系统摄像头
    if(!v.open(0))
    {
        QMessageBox::information(this, "", "打开系统摄像头失败!");
        return;
    }

    //配置  级联分类器
    if(!c.load("D:\\opencv\\image\\haarcascade_frontalface_alt.xml"))
    {
        QMessageBox::information(this, "", "配置级联分类器失败!");
        return;
    }

    //判断是否录入过人脸
    QFile file("D:\\opencv\\image\\my_face.xml");
    //判断文件是否存在
    if(file.exists())
    {
        //表示之前录入过人脸  则下载文件
        recognizer = LBPHFaceRecognizer::load<LBPHFaceRecognizer>("D:\\opencv\\image\\my_face.xml");

    }else {
        //表示之前没有录入过人脸
        recognizer = LBPHFaceRecognizer::create();
    }

    //启动一个人脸检测定时器
    check_id = startTimer(3000);
    flag = 1; //可以人脸检测
    recognizer->setThreshold(100);

}

Widget::~Widget()
{
    delete ui;
}

//打开摄像头按钮对应的  槽函数
void Widget::on_openBtn_clicked()
{
    //启动一个定时器
    camera_id = startTimer(30);
}

//定时器重写的功能函数
void Widget::timerEvent(QTimerEvent *e)
{
    //判断是否是  摄像头定时器  超时
    if(e->timerId() == camera_id)
    {
        //读取系统摄像头中的图像
        v.read(src);

        //图像反转
        flip(src, src, 1);

        //将 bgr 转换成  rgb
        cvtColor(src, rgb, CV_BGR2RGB);

        //将图像重新设置大小  适应lab
        cv::resize(rgb, rgb, Size(301,251));

        //灰度处理
        cvtColor(rgb, gray, CV_RGB2GRAY);

        //均衡化处理
        equalizeHist(gray, dst);

        //锁定人脸矩形框位置
        c.detectMultiScale(dst, faces);

        //将矩形框绘制到人脸上
        for(uint i=0; i<faces.size(); i++)
        {
            rectangle(rgb, faces[i], Scalar(255,0,0),2);
        }

        //将图像放入 lab 中
        QImage img(rgb.data, rgb.cols, rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);

        ui->label->setPixmap(QPixmap::fromImage(img));

    }

    //判断是否是  人脸录入定时器  超时
    if(e->timerId() == face_id)
    {
        if(0 == flag)
        {

            qDebug() << "人脸录入中,请正视摄像头!";

            Mat face = src(faces[0]); //将摄像头当前的一帧图像上的一个人脸给face

            //灰度处理
            cvtColor(face, face, CV_BGR2GRAY);

            //均衡化处理
            equalizeHist(face, face);

            //将人脸放入数组中
            study_faces.push_back(face);
            study_lables.push_back(1);

            count++;
            if(50 == count)
            {
                //将图像模型转换成数据模型
                recognizer->update(study_faces, study_lables);
                recognizer->save("D:\\opencv\\image\\my_face.xml");

                QMessageBox::information(this, "", "录入人脸成功!");
                //关闭定时器
                killTimer(face_id);
                flag = 1; //表示可以人脸识别
                study_faces.clear(); //将存放人脸数组清空,方便下次录入
                study_lables.clear();

            }
        }
    }

    //判断是否是  人脸检测定时器  超时
    if(e->timerId() == check_id)
    {
        if(1 == flag)
        {
            QFile file("D:\\opencv\\image\\my_face.xml");

            if(file.exists())
            {
                if(recognizer.empty() || faces.empty())
                {
                    return;
                }

                Mat face = src(faces[0]);

                //灰度处理
                cvtColor(face, face, CV_BGR2GRAY);

                //
                equalizeHist(face, face);

                int lab = -1;
                double cof = 0.0;

                recognizer->predict(face, lab, cof);

                //根据 lab 判断是否识别成功
                if(lab != -1)
                {
                    QMessageBox::information(this, "", "人脸识别成功!");

                    ui->weChatBtn->setEnabled(true);

                    killTimer(check_id);

                }

            }

        }
    }

}

//关闭摄像头按钮对应的槽函数
void Widget::on_closeBtn_clicked()
{
    killTimer(camera_id);
}

//录入人脸按钮对应的槽函数
void Widget::on_faceBtn_clicked()
{
    count = 0; // 将录入人脸的次数设置为0
    flag = 0; //表示只能做人脸录入,不能做人脸检测
    face_id = startTimer(50);

}

main.c文件:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

 ui布局:

 

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

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

相关文章

力扣141A

文章目录 1. 题目链接2. 题目代码3. 题目总结4. 代码分析 1. 题目链接 Amusing Joke 2. 题目代码 #include<iostream> #include<string> using namespace std;int letterOfInt[30]; int letterAtDoorOfInt[30];int main(){string guestName;string hostName;strin…

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”&#xff0c;意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相…

OpenCompass:大模型测评工具

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

FW Activity跳转动画源码解析(一)

文章目录 跳转动画实际操作的是什么?窗口怎么知道应该执行什么动画,是透明,还是平移,还是缩放,旋转? 跳转动画实际操作的是什么? startActivity调用之后进行页面跳转,会有一系列的涉及到ActivitStar,ActivityTask,ActivityManager等类的操作,最终在执行动画会调用到Surface…

数字化营销与传统营销的完美协奏曲!

在这个数字化的时代&#xff0c;营销的世界正在发生着巨大的变革&#xff01;数字化营销如火箭般崛起&#xff0c;但传统营销也并未过时。那么&#xff0c;如何让它们携手共进&#xff0c;创造出无与伦比的营销效果呢&#xff1f;今天&#xff0c;就让我们讲述一下蚓链数字化营…

已经被驳回的商标名称还可以申请不!

看到有网友在问&#xff0c;已经驳回的商标名称还可以申请不&#xff0c;普推商标知产老杨觉得要分析看情况&#xff0c;可以适当分析下看可不可以能申请&#xff0c;当然最终还是为了下证 &#xff0c;下证概率低的不建议申请。 先看驳回理由&#xff0c;如果商标驳回是绝对理…

【U8+】修改客户端自动清退时间

【需求描述】 用友U8软件中&#xff0c; 客户端自动清退时间目前最少只能设置为20分钟无操作自动清退&#xff0c; 不能再比20分钟少&#xff0c;例如10分钟无操作自动清退。 【解决方法】 打开注册表&#xff0c;找到下述路径&#xff0c; 【计算机\HKEY_LOCAL_MACHINE\SOFT…

漂亮!身体恢复正常水准!一个家庭幸不幸福,看能量流动的方向——早读(逆天打工人爬取热门微信文章解读)

美洲杯这个时间也太绝了&#xff0c;早上9点比赛&#xff0c;乌拉圭VS巴拿马 引言Python 代码第一篇 洞见 一个家庭幸不幸福&#xff0c;看能量流动的方向第二篇结尾 引言 今天起床 有种神奇的感觉 就是精神很不错 明明昨天晚上还是12点多才睡觉 早上6点20有意识 在头脑里面演…

【SpringMVC】第8-14章

第8章 文件上传与下载 8.1 文件上传 使用SpringMVC6版本&#xff0c;不需要添加以下依赖&#xff0c;Spring5以及之前版本需要&#xff1a; <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>&…

成都城市低空载人交通完成首航,沃飞助力航线运行实践!

6月20日&#xff0c;成都市低空交通管理服务平台开启首次实战检验&#xff0c;并进行了城市低空载人出行验证飞行。沃飞长空作为成都本地低空出行企业代表和执飞单位&#xff0c;与政府各部门通力合作&#xff0c;圆满完成了此次飞行任务。 上午9:30&#xff0c;随着塔台发出指…

确保群发短信发送成功的有效方法

群发短信是众多商家和企业宣传和推广的常用手段。然而&#xff0c;市场上短信群发服务参差不齐&#xff0c;存在“不实发”或“扣量”的情况&#xff0c;这让客户对短信的到达率产生了担忧。那么&#xff0c;我们该如何确保群发的短信已经成功发送呢&#xff1f; 首先&#xff…

十大排序算法之->计数排序

一、计数排序简介 计数排序是一种非比较排序算法&#xff0c;适用于整数数组&#xff0c;时间复杂度为O(nk)&#xff0c;其中n为待排序数组的长度&#xff0c;k为待排序数组中最大值与最小值之差。 计算排序的原理是通过计算每个元素的出现次数或位置&#xff0c;而不是通过比…

上榜 Gartner丨中国领先数据基础设施代表厂商 DolphinDB

近日&#xff0c;Gartner 发布了 Innovation Insight: Data Infrastructure Evolves as the Foundation of D&A Ecosystem in China 这一深度研究报告&#xff0c;分析了当前企业使用数据基础设施的现状以及未来发展趋势。DolphinDB 凭借协同生态建设、云边一体架构和 AI 应…

C++的智能指针 RAII

目录 产生原因 RAII思想 C11的智能指针 智能指针的拷贝与赋值 shared_ptr的拷贝构造 shared_ptr的赋值重置 shared_ptr的其它成员函数 weak_ptr 定制删除器 简单实现 产生原因 产生原因&#xff1a;抛异常等原因导致的内存泄漏 int div() {int a, b;cin >> a…

@ControllerAdvice:你可以没用过,但是不能不了解

1.概述 最近在梳理Spring MVC相关扩展点时发现了ControllerAdvice这个注解&#xff0c;用于定义全局的异常处理、数据绑定、数据预处理等功能。通过使用 ControllerAdvice&#xff0c;可以将一些与控制器相关的通用逻辑提取到单独的类中进行集中管理&#xff0c;从而减少代码重…

前端开发接单公司做到哪些点,客户才愿意把项目包给你。

作为前端外包接单公司&#xff0c;你知道客户选择和你合作都看中哪些因素吗&#xff1f;单纯是价格吗&#xff1f;未必&#xff0c;本位给大家列举7个要素&#xff0c;并对每个要素做了定位&#xff0c;大家查缺补漏吧。 作为前端外包接单公司&#xff0c;要吸引同行客户将前端…

优秀的“抗霾”神器:气膜体育馆—轻空间

随着空气污染问题日益严重&#xff0c;尤其是雾霾天气频发&#xff0c;体育运动的场地环境质量受到越来越多的关注。气膜体育馆作为一种新型的体育场馆解决方案&#xff0c;以其独特的设计和多重优势&#xff0c;成为了优秀的“抗霾”神器。轻空间将深入探讨气膜体育馆的特点和…

pycharm不能安装包的解决方法

一直使用VScode写python&#xff0c;最近使用pycharm&#xff0c;但是pycharm不能安装包&#xff0c;类似这种 后面直接使用ALT F12跳转终端&#xff1a; pip install 需要添加的包 -i https://pypi.tuna.tsinghua.edu.cn/simple不报错了

Gitee 的公钥删不掉

公钥管理里已经没有公钥了&#xff0c; 仓库里还有&#xff0c;这是怎么回事&#xff1f; 这两个好像又没什么关系。 那为啥要搞两处呢&#xff1f; 个人信息里的公钥一直就没有仓库里使用的公钥&#xff0c; 删掉个人信息里的也没什么影响。 在仓库管理页面导入新公钥提示已…

【shell脚本速成】mysql备份脚本

文章目录 案例需求脚本应用场景&#xff1a;解决问题脚本思路实现代码 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻…