简易版人脸识别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:…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...