QT实现人脸识别

QT实现人脸识别

Face.pro文件:

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += 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.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.uiINCLUDEPATH += 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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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; //打开摄像头的定时器idvoid 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 转换成  rgbcvtColor(src, rgb, CV_BGR2RGB);//将图像重新设置大小  适应labcv::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; // 将录入人脸的次数设置为0flag = 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布局:

 

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

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

相关文章

「C系列」C 内存管理

文章目录 一、C 内存管理1. 静态内存分配2. 栈内存分配3. 堆内存分配注意事项 二、C 内存管理的函数和描述1. malloc()2. calloc()3. realloc()4. free() 三、相关链接 一、C 内存管理 C 语言的内存管理主要由程序员负责&#xff0c;这意味着你需要手动分配和释放内存以避免内…

通俗范畴论4 范畴的定义

注&#xff1a;由于CSDN无法显示本文章源文件的公式&#xff0c;因此部分下标、字母花体、箭头表示可能会不正常&#xff0c;请读者谅解 范畴的正式定义 上一节我们在没有引入范畴这个数学概念的情况下&#xff0c;直接体验了一个“苹果1”范畴&#xff0c;建立了一个对范畴的…

【新闻】AI程序员要来了吗?阿里云官宣

内容提要 6 月 21 日&#xff0c;在阿里云上海 AI 峰会上&#xff0c;阿里云宣布推出首个AI 程序员。 据介绍&#xff0c;这个AI程序员具备架构师、开发工程师、测试工程师等多种岗位的技能&#xff0c;能一站式自主完成任务分解、代码编写、测试、问题修复、代码提交整个过程…

跨界收益:企业数字化转型的致胜秘密!

在数字化的浪潮中&#xff0c;企业如何突破传统&#xff0c;面向未来&#xff1f;跨界收益&#xff0c;这个看似神秘的力量&#xff0c;正成为企业数字化转型的关键所在&#xff01;让我们一同揭开它的神秘面纱&#xff0c;探寻其中的奥秘吧&#xff01; 在企业数字化转型中&am…

集群环境中分发文件的脚本

由于在集群中手动分发文件较为麻烦&#xff0c;这里记录一下自动分发脚本。 1 脚本说明 该脚本用于将文件分发到远程设备。默认分发文件的路径为脚本所在路径&#xff0c;默认分发目标地址为node1和node2。可以在启动脚本时手动输入分发文件的路径和目标设备地址&#xff0c;…

教育护眼灯品牌排行有哪些上榜?中国十大教育照明品牌分享

在当前的时代背景下&#xff0c;孩子们的课业负担依然沉重。随着他们年龄的增长&#xff0c;作业量不断增加&#xff0c;对视力的需求也随之上升。加之&#xff0c;现今许多作业需借助电子屏幕完成&#xff0c;孩子们面临视力问题的风险因而愈加提早。家长们逐渐认识到&#xf…

一个端口配置两个vue和后端服务,nginx以及前后端服务怎么配?

nginx配置重点看server中的内容&#xff1a; worker_processes 8; pid /usr/local/nginx/logs/nginx.pid;events {# 此为 Linux 系统特为处理大批量文件描述符而作改进的 poll 事件模型use epoll;worker_connections 512; # 工作进程的最大连接数量# 允许同时接受多个网络连…

注意,华为HCIP考试近期变题频繁,请密切关注

最近&#xff0c;华为HCIP考试频繁变题&#xff0c;不少人在后台咨询小编&#xff0c;在此统一回复下。 具体情况是&#xff0c;继HCIP Datacom H12-831在4月份变题后&#xff0c;上周HCIP-Security H12-725也发生了变题。 而本周&#xff0c;HCIP-WLAN H12-323再次变题。 01 变…

静态文件及模板

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 静态文件 动态Web应用也会需要静态文件&#xff0c;通常是CSS和JavaScript文件。Flask可以向已经配置好的Web服务器提供静态文件&#xff0c;只要…

制作微信小程序“飞翔的小鸟”

微信小程序为开发者提供了一个强大的平台&#xff0c;可以快速创建各种有趣的应用。在这篇博客中&#xff0c;我们将介绍如何制作一个简单的微信小程序——“飞翔的小鸟”。 项目介绍 “飞翔的小鸟”是一款基于微信小程序的小游戏&#xff0c;玩家需要控制一只小鸟在障碍物之间…

目前什么牌子充电宝适合入手?性价比高充电宝推荐

在如今这个快节奏的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;手机电量的消耗却常常让我们陷入焦虑之中。当我们身处户外&#xff0c;急需给手机充电时&#xff0c;共享充电宝或许是个应急的选择&#xff0c;但您是否注意到&#xff0c;共享充…

监控系统的4个黄金指标

最近被问到一个问题&#xff0c;是关于监控系统的4个黄金信号&#xff08;也被称为黄金指标&#xff09;的&#xff0c;不太记得了&#xff0c;看了一些资料&#xff0c;做个笔记。 来源 监控系统的4个黄金指标来源于《SRE&#xff1a;Google运维解密》这本书的第六章 分布式…

面试题3:GET 和 POST 有什么区别?

[!]高频面试题。 GET 和 POST 没有本质区别&#xff0c;可以进行相互代替。 1、GET语义&#xff1a;“从服务器获取数据”&#xff1b;POST语义&#xff1a;“往服务器上提交数据”。[设计初衷&#xff0c;不一定要遵守] 2、发请求时&#xff0c;给服务器传递的数据&#xff…

通用大模型VS垂直大模型:你更青睐哪一方?

目录 引言 背景介绍 国内外垂直大模型的发展情况 国内外通用大模型的发展情况 哪一路径更为火热&#xff1f; 能力分析 通用大模型的独特能力 垂直大模型的独特能力 两者的差异与互补 难点探究 算力的挑战 数据的挑战 算法的挑战 结论 表格总结 引言 AI大模型的战…

CMake 详解

CMake 说明 cmake的定义是什么 &#xff1f;-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目&#xff0c;最终要输出一个可执行文件或者共享库&#xff08;dll&#xff0c;so等等&#xff09;这时候神器就出现了-----CMake&#xff01; 所有操作都是通过…

Qt封装号的数据库操作类

连接QMYSQL&#xff0c;包含断线重连 头文件&#xff08;xxx.h&#xff09; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QThread.h> #include <QQueue> #include <QMutex> #include <QSqlDatabase> #include …

用一个实例看如何分享大量照片 续篇一

继续上篇的实例分享&#xff0c;在此罗列一些应该注意的细节&#xff0c;以便在下次可以更加省时省力。 最重要的是呈现构想&#xff0c;如按活动/主题、班级/板块、地区/国家等等&#xff0c;这些都应该事先计划好&#xff0c;事后改动工作量巨大&#xff0c;因为太容易出错&a…

中东文明史

转自&#xff1a;想要了解完整的中东文明史&#xff1f;这篇文章成全你 - 知乎 (zhihu.com) 写在前面 中东文明是人类历史上最古老的文明。人类祖先从东非大裂谷走出之后&#xff0c;首先选择定居在中东地区的新月沃土上&#xff0c;并建立了人类历史上有文字记载的第一个文明…

java课程设计GUI学生信息管理系统

目录 系统内容.. 3 用户界面模块... 4 数据存储模块... 4 信息管理模块... 4 管理模块.. 4 主要模块的算法描述... 4 –简要的语言描述... 4 运行及调试分析&#xff08;测试数据及测试结果&#xff09;.. 5 课程设计总结... 7 参考文献&#xff08;至少三个&#xf…

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例&#xff1a; #include <stdio.h>// DALIN PID 结构体定义 typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivativ…