简易版人脸识别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界面

相关文章:
简易版人脸识别qt opencv
1、配置文件.pro #------------------------------------------------- # # Project created by QtCreator 2023-09-05T19:00:36 # #-------------------------------------------------QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET 01_face TEMP…...
如何系统地学习 JavaScript?
前言 在学习JavaScript前需要先将Html和Css的相关知识点弄清楚,Js的很多操作是要结合Html和Css,下面我总结了Html、Css和Js的相关学习知识点供参考,希望对你有所帮助喔~ Html 文档学习 【HTML 】w3school教程 :https://www.w3school.com.…...
对称二叉树(Leetcode 101)
题目 101. 对称二叉树 思路 使用层序遍历,遍历当前层的节点时,如该节点的左(右)孩子为空,在list中添加null,否则加入左(右)孩子的值。每遍历完一层则对当前list进行判断,…...
动手学深度学习(2)-3.5 图像分类数据集
文章目录 引言正文图像分类数据集主要包介绍主要流程具体代码练习 总结 引言 这里主要是看一下如何加载数据集,并且生成批次训练的数据。最大的收获是,知道了如何在训练阶段提高模型训练的性能 增加batch_size增加num_worker数据预加载 正文 图像分类…...
C标准输入与标准输出——stdin,stdout
🔗 《C语言趣味教程》👈 猛戳订阅!!! —— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#…...
如何将home目录空间扩充到根目录下
目录 1、查看查看磁盘使用情况2、扩容思路3、卸载并删除/home4、扩大/root逻辑卷5、扩大/文件系统6、重建/home逻辑卷7、创建/home文件系统8、将新建的文件系统挂载到/home目录下9、恢复/home并删除备份10、再次查看看磁盘存储 系统:centos7.9 1、查看查看磁盘使用…...
Ceph PG Peering数据修复
ceph数据修复 当PG完成了Peering过程后,处于Active状态的PG就可以对外提供服务了。如果该PG的各个副本上有不一致的对象,就需要进行修复。 Ceph的修复过程有两种:Recovery和Backfill。 Recovery是仅依据PG日志中的缺失记录来修复不一致的对…...
服务器上使用screen和linux的基本操作
临时换源 pip install torch1.7.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package pip install torch1.7.1 -i http://pypi.douban.com/simple some-package临时清华源和豆瓣源 配环境的一点小问题 我们尽量是去配置能满足代码的环境,而不要想着修改…...
Kafka3.0.0版本——文件存储机制
这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念,…...
Linux如何安装MySQL
Linux安装MySQL5.7 1、下载 官网下载地址:http://dev.mysql.com/downloads/mysql/ 2、复制下面几个文件 3、检查当前系统是否安装过mysql、检查当前mysql依赖环境、检查/tmp文件夹权限 1)检查当前系统是否安装过mysql,执行安装命令前&am…...
确保网络的安全技术介绍
防火墙技术 防火墙是隔离本地网络与外界网络的一道防御系统。通常用于内部局域网 与外部广域网之间,通过限制外部网络用户以非法手段来访问内部资源,来达到保 护内部网络的安全。根据安全规则,防火墙对任何外部网络访问内部网络的行为进 …...
机器学习练习
原文章添加链接描述...
算法通关村第十九关——最小路径和
LeetCode64. 给定一个包含非负整数的 m n 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 输入:grid[[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径1→3→1→1→1的总和最小。 public int minPath…...
Linux 访问进程地址空间函数 access_process_vm
文章目录 一、源码解析二、Linux内核 用途2.1 ptrace请求2.2 进程的命令行 参考资料 一、源码解析 /*** get_task_mm - acquire a reference to the tasks mm** Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning* this kernel workthread has transiently a…...
selenium 动态爬取页面使用教程以及使用案例
Selenium 介绍 概述 Selenium是一款功能强大的自动化Web浏览器交互工具。它可以模拟真实用户在网页上的操作,例如点击、滚动、输入等等。Selenium可以爬取其他库难以爬取的网站,特别是那些需要登录或使用JavaScript的网站。Selenium可以自动地从Web页面…...
小程序中如何查看会员的积分和变更记录
积分是会员卡的一个重要功能,可以用于激励会员消费和提升用户粘性。在小程序中,商家可以方便地查看会员卡的积分和变更记录,以便更好地了解会员的消费行为和积分变动情况。下面将介绍如何在小程序中查看会员卡的积分和变更记录。 1. 找到指…...
音视频 ffmpeg命令直播拉流推流
直播拉流 ffplay rtmp://server/live/streamName ffmpeg -i rtmp://server/live/streamName -c copy dump.flv对于不是rtmp的协议 -c copy要谨慎使用 直播推流 ffmpeg -re -i out.mp4 -c copy flvrtmp://server/live/streamName参数:-re,表示按时间戳读取文件 参…...
Python钢筋混凝土结构计算.pdf-T001-混凝土强度设计值
以下是使用Python求解上述问题的完整代码: # 输入参数 f_ck 35 # 混凝土的特征抗压强度(单位:MPa) f_cd 25 # 混凝土的强度设计值(单位:MPa) # 求解安全系数 gamma_c f_ck / f_cd # …...
长风破浪会有时,直挂云帆济沧海!(工作室年会总结)
前言 我也是有段时间没写过总结性的博客了。最近是很忙的,尤其是年会那两天,我甚至可以说这是我这辈子目前最忙的两天。但这段经历还是很值得我记录下来的,也是给后面有需要的人提供的一些建议。我个人也是第一次筹办这种大型些的活动&#x…...
(数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述
文章目录 一:边界描述(1)边界链码A:概述B:边界链码改进C:程序 (2)傅里叶描绘子A:概述B:程序 二:矩描述(1)矩A:…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...
关于疲劳分析的各种方法
疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数,可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础,采用雨流法取出一个个相互独立、互不相关的应力循环&…...
Android多媒体——音/视频数据播放(十八)
在媒体数据完成解码并准备好之后,播放流程便进入了最终的呈现阶段。为了确保音视频内容能够顺利输出,系统需要首先对相应的播放设备进行初始化。只有在设备初始化成功后,才能真正开始音视频的同步渲染与播放。这一过程不仅影响播放的启动速度,也直接关系到播放的稳定性和用…...
