当前位置: 首页 > news >正文

简易版人脸识别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的相关知识点弄清楚&#xff0c;Js的很多操作是要结合Html和Css&#xff0c;下面我总结了Html、Css和Js的相关学习知识点供参考&#xff0c;希望对你有所帮助喔~ Html 文档学习 【HTML 】w3school教程 :https://www.w3school.com.…...

对称二叉树(Leetcode 101)

题目 101. 对称二叉树 思路 使用层序遍历&#xff0c;遍历当前层的节点时&#xff0c;如该节点的左&#xff08;右&#xff09;孩子为空&#xff0c;在list中添加null&#xff0c;否则加入左&#xff08;右&#xff09;孩子的值。每遍历完一层则对当前list进行判断&#xff0c…...

动手学深度学习(2)-3.5 图像分类数据集

文章目录 引言正文图像分类数据集主要包介绍主要流程具体代码练习 总结 引言 这里主要是看一下如何加载数据集&#xff0c;并且生成批次训练的数据。最大的收获是&#xff0c;知道了如何在训练阶段提高模型训练的性能 增加batch_size增加num_worker数据预加载 正文 图像分类…...

C标准输入与标准输出——stdin,stdout

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…...

如何将home目录空间扩充到根目录下

目录 1、查看查看磁盘使用情况2、扩容思路3、卸载并删除/home4、扩大/root逻辑卷5、扩大/文件系统6、重建/home逻辑卷7、创建/home文件系统8、将新建的文件系统挂载到/home目录下9、恢复/home并删除备份10、再次查看看磁盘存储 系统&#xff1a;centos7.9 1、查看查看磁盘使用…...

Ceph PG Peering数据修复

ceph数据修复 当PG完成了Peering过程后&#xff0c;处于Active状态的PG就可以对外提供服务了。如果该PG的各个副本上有不一致的对象&#xff0c;就需要进行修复。 Ceph的修复过程有两种&#xff1a;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临时清华源和豆瓣源 配环境的一点小问题 我们尽量是去配置能满足代码的环境&#xff0c;而不要想着修改…...

Kafka3.0.0版本——文件存储机制

这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念&#xff0c…...

Linux如何安装MySQL

Linux安装MySQL5.7 1、下载 官网下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2、复制下面几个文件 3、检查当前系统是否安装过mysql、检查当前mysql依赖环境、检查/tmp文件夹权限 1&#xff09;检查当前系统是否安装过mysql&#xff0c;执行安装命令前&am…...

确保网络的安全技术介绍

防火墙技术 防火墙是隔离本地网络与外界网络的一道防御系统。通常用于内部局域网 与外部广域网之间&#xff0c;通过限制外部网络用户以非法手段来访问内部资源&#xff0c;来达到保 护内部网络的安全。根据安全规则&#xff0c;防火墙对任何外部网络访问内部网络的行为进 …...

机器学习练习

原文章添加链接描述...

算法通关村第十九关——最小路径和

LeetCode64. 给定一个包含非负整数的 m n 网格 grid,请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 输入&#xff1a;grid[[1,3,1],[1,5,1],[4,2,1]] 输出&#xff1a;7 解释&#xff1a;因为路径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浏览器交互工具。它可以模拟真实用户在网页上的操作&#xff0c;例如点击、滚动、输入等等。Selenium可以爬取其他库难以爬取的网站&#xff0c;特别是那些需要登录或使用JavaScript的网站。Selenium可以自动地从Web页面…...

小程序中如何查看会员的积分和变更记录

​积分是会员卡的一个重要功能&#xff0c;可以用于激励会员消费和提升用户粘性。在小程序中&#xff0c;商家可以方便地查看会员卡的积分和变更记录&#xff0c;以便更好地了解会员的消费行为和积分变动情况。下面将介绍如何在小程序中查看会员卡的积分和变更记录。 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参数&#xff1a;-re,表示按时间戳读取文件 参…...

Python钢筋混凝土结构计算.pdf-T001-混凝土强度设计值

以下是使用Python求解上述问题的完整代码&#xff1a; # 输入参数 f_ck 35 # 混凝土的特征抗压强度&#xff08;单位&#xff1a;MPa&#xff09; f_cd 25 # 混凝土的强度设计值&#xff08;单位&#xff1a;MPa&#xff09; # 求解安全系数 gamma_c f_ck / f_cd # …...

长风破浪会有时,直挂云帆济沧海!(工作室年会总结)

前言 我也是有段时间没写过总结性的博客了。最近是很忙的&#xff0c;尤其是年会那两天&#xff0c;我甚至可以说这是我这辈子目前最忙的两天。但这段经历还是很值得我记录下来的&#xff0c;也是给后面有需要的人提供的一些建议。我个人也是第一次筹办这种大型些的活动&#x…...

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述

文章目录 一&#xff1a;边界描述&#xff08;1&#xff09;边界链码A&#xff1a;概述B&#xff1a;边界链码改进C&#xff1a;程序 &#xff08;2&#xff09;傅里叶描绘子A&#xff1a;概述B&#xff1a;程序 二&#xff1a;矩描述&#xff08;1&#xff09;矩A&#xff1a;…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

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

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

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的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

ubuntu22.04有线网络无法连接,图标也没了

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