简易版人脸识别qt opencv

1、配置文件.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-05T19:00:36
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = 01_face
TEMPLATE = appSOURCES += 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

2、头文件

#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;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void timerEvent(QTimerEvent *event);         //定时器事件处理函数private slots:void on_open_camera_Btn_clicked();void on_close_camera_Btn_clicked();void on_input_face_Btn_clicked();private:Ui::Widget *ui;/************************第一模块:关于摄像头的组件***********************/VideoCapture v; //定义一个视频流对象Mat src;   //原图像Mat rgb;   //由于qt不识别grb图像,所以需要转化为rgb图像Mat gray;  //灰度图Mat dst;  //均衡化图像CascadeClassifier c;  //级联分类器,用来获取人像的矩形框vector<Rect> faces;  //定义一个存储人像矩形的容器int camera_timer_id;  //定时器/************************第二模块:录入人脸的组件***********************/Ptr<FaceRecognizer> recognizer;  //人脸识别器vector<Mat> study_face;   //要录入的人脸容器vector<int> Study_lab;    //要录入的人脸标签int input_timer_id;     //录入人脸的定时器int flag;    //判断是否正在录入中int count;   //记录收集到的人脸的次数/************************第三模块:人脸检测的组件***********************/int check_timer_id;   //定义一个人脸检测的定时器};#endif // WIDGET_H

3、源文件

main.app

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"int face_count = 1;  //录入对应的标签号
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//打开摄像头if(!v.open(0)){QMessageBox::information(this, "提示", "摄像头打开失败");return;}//将级联分类器加载进来if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml")){QMessageBox::information(this, "提示", "练级分类器加载失败");return;}//配置人脸识别器QFile file("D:/opencv/resource/Face.xml");//判断是否存在,存在将其下载下来,不存在创建人脸模型if(file.exists()){//存在人脸模型,下载进来recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("D:/opencv/resource/Face.xml");}else{//不存在,创建LBPHFaceRecognizer::create()recognizer = LBPHFaceRecognizer::create();}//启动人脸检测定时器check_timer_id = startTimer(3000);flag = 0;//设置可信度recognizer->setThreshold(100);}Widget::~Widget()
{delete ui;
}//打开摄像头按钮的槽函数
void Widget::on_open_camera_Btn_clicked()
{//开启定时器camera_timer_id = this->startTimer(20);}void Widget::on_close_camera_Btn_clicked()
{//关闭定时器this->killTimer(camera_timer_id);
}//定时器事件的函数
void Widget::timerEvent(QTimerEvent *event)
{//判断是否是打开摄像头定时器到位if(event->timerId() == camera_timer_id){//获取图像//函数原型:virtual bool read(OutputArray image);//参数:存储读取到的图像容器//成功返回真,失败/读取完毕返回假v.read(src);//翻转图像//函数原型:oid flip(InputArray src, OutputArray dst, int flipCode);flip(src, src, 1);//将图像转为rgb模式cvtColor(src, rgb, CV_BGR2RGB);//重新设置图像大小cv::resize(rgb, rgb, Size(300,300));//灰度化处理cvtColor(rgb, gray, CV_RGB2GRAY);//均衡化处理equalizeHist(gray, dst);//使用级联分类器获取人脸图像的矩形框,并存入参数2中(人像矩形框容器中)//函数原型:void detectMultiScale( InputArray image,//                        CV_OUT std::vector<Rect>& objects,//                      double scaleFactor = 1.1,//                    int minNeighbors = 3, int flags = 0,//                  Size minSize = Size(),//                Size maxSize = Size() );c.detectMultiScale(dst, faces);//将矩形框绘制到rgb图像中去for(int i=0; i<faces.size(); i++){//使用全局函数rectangle函数,进行绘制rectangle(rgb, faces[i], Scalar(255, 0, 0), 1);}//将图像显示到ui界面上,ui界面的图像为QPixmap//需要将rgb图转为QImage的图像,再转为QPIXmapQImage img(rgb.data, rgb.cols, rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);//功能:通过其他图像构造一个QImage图像//参数1:其他图像的数据//参数2:图像的宽度(列)//参数3:图像的高度(4)//参数4:每一行的字节数(列*通道)//参数5:图像格式,24位图,每一中颜色使用1字节8位表示//将其设置到ui界面的组件上ui->camera_Lab->setPixmap(QPixmap::fromImage(img));   //QPixmap::fromImage(img);  将QImage图像转为QPixmap图像}//判断是否是录入人脸定时器到位if(input_timer_id == event->timerId()){qDebug() << "正在录入....";//判断ui界面是否有矩形框if(faces.empty()) return;//判断人脸识别器是否存在if(recognizer.empty()) return;//获取矩形框中的图像Mat face = src(faces[0]);//重新设置大小cv::resize(face, face, Size(100, 100));//灰度化处理cvtColor(face, face, CV_BGR2GRAY);//均衡化处理equalizeHist(face, face);qDebug() << face_count;//将图像放入学习容器中study_face.push_back(face);Study_lab.push_back(face_count);count++;//当收集50张后更新学习模型if(50 == count){qDebug() << "hahhah";//将图像模型转为数据模型//函数原型:virtual void update(InputArrayOfArrays src, InputArray labels);//参数1:要进行更新的人脸图像容器//参数2:要进行封信的人脸标签容器recognizer->update(study_face, Study_lab);//将数据模型存入到本地磁盘中去recognizer->save("D:/opencv/resource/Face.xml");QMessageBox::information(this, "提示", "人脸录入成功");flag = 0;count = 0;killTimer(input_timer_id);study_face.clear();Study_lab.clear();face_count++;}}//判断是否是人脸检测定时器到位if(event->timerId() == check_timer_id){if(0 == flag){QFile file("D:/opencv/resource/Face.xml");//判断文件是否存在if(file.exists()){//判断ui->界面是否有矩形框和人脸识别器是否有if(faces.empty() || recognizer.empty()) return;//到此说明开始检测//获取ui界面上的矩形框中的图像Mat face = src(faces[0]);//重新设置图像大小, 与录入人脸时的大小一致cv::resize(face, face, Size(100, 100));//灰度化处理cvtColor(face, face, CV_BGR2GRAY);//均衡化处理equalizeHist(face, face);//定义记录,检测后的结果int lab = -1;double conf = 0.0;//将人脸进行检测recognizer->predict(face, lab, conf);//判断是否匹配if(lab != -1){qDebug() <<"匹配成功";}qDebug() << lab;}}}
}//录入人脸对应的参函数
void Widget::on_input_face_Btn_clicked()
{//启动定时器input_timer_id = startTimer(60);//将flag设置为1, 表明正在录入flag = 1;count = 0;}

4、ui界面

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

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

相关文章

代码随想录笔记--二叉树篇

目录 1--递归遍历 1-1--前序遍历 1-2--中序遍历 1-3--后序遍历 2--迭代遍历 2-1--前序遍历 2-2--后序遍历 2-3--中序遍历 3--二叉树的层序遍历 4--翻转二叉树 5--对称二叉树 6--二叉树最大深度 7--二叉树的最小深度 8--完全二叉树节点的数量 9--平衡二叉树 10-…

PyCharm 虚拟环境搭建

Anaconda搭建虚拟环境 安装 前往Anaconda官网&#xff08;https://www.anaconda.com/products/individual&#xff09;&#xff0c;下载适合您操作系统的Anaconda版本&#xff0c;建议下载最新的稳定版。这里可以直接进入这个&#xff1a;https://repo.anaconda.com/archive/ …

AVR128单片机 USART通信控制发光二极管显示

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void port_init(void) { PORTA 0xFF; DDRA 0x00;//输入 PORTB 0xFF;//低电平 DDRB 0x00;//输入 PORTC 0xFF;//低电平 DDRC 0xFF;//输出 PORTE 0xFF; DDRE 0xfE;//输出 PO…

无涯教程-JavaScript - DCOUNT函数

描述 DCOUNT函数返回包含与您指定条件匹配的列表或数据库的列中的数字的单元格的计数。 语法 DCOUNT (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的行是记录,数据的列是…

编译CentOS6.10系统的OpenSSHV9.4rpm安装包

目前OpenSSH版本已至9.4&#xff0c;其作为操作系统底层管理平台软件&#xff0c;需要保持更新以免遭受安全攻击&#xff0c;编译生成rpm包是生产环境中批量升级的最佳途径。编译软件包时与当前的运行环境有较大关系&#xff0c;请注意本安装包系在CentOS6.10原生系统纯净系统下…

Ubuntu下QT操作Mysql数据库

本篇总结一下一下Ubuntu下QT操作Mysql数据库。 目录 1. 启动Mysql数据库服务器 2.查看QT支持的数据库驱动 3.连接数据库 4. 增加表和记录 5. 删除记录 6. 修改记录 7. 查询记录 8.完整代码和运行效果 常见错误总结&#xff1a; (1) 数据库服务没启动报错信息 (2) 有…

【Vuex状态管理】Vuex的基本使用;核心概念State、Getters、Mutations、Actions、Modules的基本使用

目录 1_应用状态管理1.1_状态管理1.2_复杂的状态管理1.3_Vuex的状态管理 2_Vuex的基本使用2.1_安装2.2_创建Store2.3_组件中使用store 3_核心概念State3.1_单一状态树3.2_组件获取状态3.3_在setup中使用mapState 4_核心概念Getters4.1_getters的基本使用4.2_getters第二个参数4…

SpringBoot整合MQ

1.创建工程并引入依赖 <!-- 添加rocketmq的启动器--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.1.1</version></dependency>2.编写…

Unity汉化一个插件 制作插件汉化工具

我是编程一个菜鸟&#xff0c;英语又不好&#xff0c;有的插件非常牛&#xff01;我想学一学&#xff0c;页面全是英文&#xff0c;完全不知所措&#xff0c;我该怎么办啊...尝试在Unity中汉化一个插件 效果&#xff1a; 思路&#xff1a; 如何在Unity中把一个自己喜欢的插件…

SQL Server如何新建作业

作业&#xff1a; 在 SQL Server 中&#xff0c;作业&#xff08;Job&#xff09;是一组可以在预定时间自动执行的任务。可以将作业看作是一个可以在后台运行的程序或脚本。作业由一系列步骤组成&#xff0c;每个步骤都是一个独立的任务&#xff0c;可以执行诸如执行 SQL 查询…

架构师如何做好需求分析

架构师如何做好需求分析 目录概述需求&#xff1a; 设计思路实现思路分析1.主要步骤 2.主要步骤2操作步骤 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,…

【已解决】使用xshell来ssh到vmware的虚拟机,请求超时的问题

我的情况&#xff1a; 1.本地ping虚拟机请求超时&#xff0c;但是虚拟机ping本地成功 2.本地和虚拟机的防火墙都关了&#xff0c;ssh服务也开了 3.端口也是正确的 百思不得其解&#xff0c;不知道为什么就是连接不上 当出现这种情况的时候&#xff0c;可以考虑一下vmware的…

【Java】Jxls--轻松生成 Excel

1、介绍 Jxls 是一个小型 Java 库&#xff0c;可以轻松生成 Excel 报告。Jxls 在 Excel 模板中使用特殊标记来定义输出格式和数据布局。 Java 有一些用于创建 Excel 文件的库&#xff0c;例如Apache POI。这些库都很好&#xff0c;但都是一些较底层的库&#xff0c;因为它们要…

Vue3【Provide/Inject】

前言 自从使用了Provide/Inject代码的组织方式更加灵活了&#xff0c;但是这个灵活性的增加伴随着代码容错性的降低。我相信只要是真的在项目中引入Provide/Inject的同学&#xff0c;一定一定有过或者正在经历下面的状况&#xff1a; 注入名&#xff08;Injection key&#x…

C++中虚继承时的构造函数

在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。 下面…

VBA技术资料MF51:VBA_在Excel中突出显示唯一值

【分享成果&#xff0c;随喜正能量】世间万物&#xff0c;因果循环不休&#xff0c;你的善心善行&#xff0c;都可能成为你的善缘善果。每天忆佛念佛&#xff0c;每天都在佛菩萨的加持下生活&#xff0c;自然吉祥如意&#xff0c;法喜充满。 。 我给VBA的定义&#xff1a;VBA是…

重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!

引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face&#xff01; Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型&#xff0c;有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数…

3D点云处理:点云投影为2D图像 调平点云(附源码)

文章目录 0. 测试效果1. 基本内容1.1 计算点云位姿1.2 调平点云1.3 点云投影2. 代码实现文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_0. 测试效果

如何远程访问Linux MeterSphere一站式开源持续测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

使用 WebGL 为 HTML5 游戏创建逼真的地形

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 建 模 和 3D 地形 大多数 3D 对象是 使用建模工具创建&#xff0c;这是有充分理由的。创建复杂对象 &#xff08;如飞机甚至建筑物&#xff09;很难在代码中完成。建模工具 几乎总是有意义的&#xff0c;但也有例外&am…