QTday06(人脸识别项目前置知识)

news/2025/3/16 16:09:51/

qt版本5.4.0:旧版本的qt,为啥要用旧版本的我也不知道

实现结果:

调用系统摄像头,用红框框住画面中的人头

代码:

pro:

#-------------------------------------------------
#
# Project created by QtCreator 2023-10-23T16:19:56
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = demo4
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

h:

#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();private slots:void on_openBtn_clicked();void on_closeBtn_clicked();private:Ui::Widget *ui;//摄像头相关的成员设置//视频流对象VideoCapture video;//存放图像的容器对象Mat src;Mat gray;Mat rgb;//存放从bgr转化成rgb图的Mat dest;//级联对象CascadeClassifier c;//图像中人脸的容器集合vector<Rect> faces;//定义一个打开摄像头的定时器int camer_time_id;void timerEvent(QTimerEvent *e);};#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);//0代表打开摄像头if(!video.open(0)){QMessageBox::information(this,"提示","打开系统摄像头失败");return;}//级联分类器的配置if(!c.load("D:\\opencv\\heads\\haarcascade_frontalface_alt.xml")){QMessageBox::information(this,"提示","配置失败");return;}}Widget::~Widget()
{delete ui;
}
//打开摄像头对应的槽函数处理
void Widget::on_openBtn_clicked()
{camer_time_id =startTimer(20);}
//定时器处理函数
void Widget::timerEvent(QTimerEvent *e)
{//判断哪个定时器//1.打开摄像头的定时器超时if(e->timerId()==camer_time_id){video.read(src);//将bgr转化位rgbcvtColor(src,rgb,CV_BGR2RGB);//设置rgb的长宽cv::resize(rgb,rgb,Size(ui->label->width(),ui->label->height()));//转化为灰度cvtColor(rgb,gray,CV_RGB2GRAY);//转化为直方图equalizeHist(gray,dest);//获取人脸放入人脸集合容器c.detectMultiScale(dest,faces);//绘制矩形框for(int i=0;i<faces.size();i++){rectangle(rgb,faces[i],Scalar(255,0,0),4);}flip(rgb,rgb,1);//0表示x轴的反转,1y轴反转,-1表示xy轴翻转//定义一个QImageQImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);//放入labelui->label->setPixmap(QPixmap::fromImage(img));}
}void Widget::on_closeBtn_clicked()
{killTimer(camer_time_id);
}

widget.ui:

运行结果:点击打开摄像头,出现画面,红框框人脸,点击关闭摄像头,定时器关闭,画面停止;

实现大致思路:

大概分为视频的调用和红框的实现:

视频的调用:视频是由一帧一帧的像素帧(也就是图片)实现,到底也是对图片的操作

首先实例化视频流对象video,打开摄像头系统video.open,通过定时器来实现画面获取(之前的demo是用while循环),获取图片video.read(src),(src为Mat对象,存储图片),根据需要对其进行处理(灰度图、直方图。。)

红框的实现:

,定义一个级联分类器CascadeClassifier c(用来后面获取人脸位置),并加载其配置文件c.load("配置文件路径"),然后调用detectMutiScale,获取人脸位置,调用循环绘制矩形,将绘制矩形后的图片以合适的格式放到label标签上就可以

一些函数解释:

视频流相关类和函数:VideoCapture

virtual bool open(const String& filename); //参数:要打开视频的路径 //返回值:成功返回true失败返回false。打开摄像头只需在构造时,调用构造函数参数传递0即可

virtual bool read(OutputArray image); 功能:读取视频流中的图像 参数:图像容器 返回值:成功读取返回true,失败或者视频结束返回false

 void flip(InputArray src, OutputArray dst, int flipCode); //将图像进行旋转 //参数1:要处理的图像 //参数2:处理后的图像容器 //参数3:处理规则:0:表示沿x翻转,1表示沿y轴翻转,2表示沿xy轴翻转

图像相关处理函数

色彩空间转化函数

函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ); //功能:将给定的图像进行色彩空间转化 //参数1:要转化的图像 //参数2:转化后的图像容器 //参数3:转化规则CV_BGR2GRAY 将彩色图转为灰度图

均衡化处理

函数原型:void equalizeHist( InputArray src, OutputArray dst ); //功能:将灰度图进行均衡化直方图拉伸 //参数1:要处理的图像,灰度图 //参数2:均衡化处理后的图像容器

级联分类器(CascadeClassifier)

下载级联分类器函数

bool load( const String& filename ); 功能:将本地的分类器模型,加载到程序中 参数:级联分类器模型的路径 返回值:bool

获取人脸矩形框

函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector<Rect>& objects) //功能:通过给定的图像,获取矩形框人脸所在区域的矩形框 //参数1:要识别的人脸图像 //参数2:识别后矩形框容器

将矩形框绘制到图像上

函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);*/ //功能:在给定的图像上,绘制给定的矩形框 //参数1:要被绘制的图像 //参数2:要绘制的矩形框 //参数3:矩形框颜色 //参数4:矩形框线条粗细


http://www.ppmy.cn/news/1172899.html

相关文章

点云从入门到精通技术详解100篇-双目鱼眼系统的畸变校正及目标重建(续)

目录 3.3双目鱼眼系统标定 3.4基于光束平差法的标定结果优化 3.5标定实验结果与分析

vscode代码快捷输入

Vscode代码片段快捷输入 常用的代码片段为了避免重复输入,可以使用Vsco的中用户代码片段进行设置,这样就可以实现快捷输入. 操作流程 如下 打开vscode的设置 2. 找到用户代码片段 3. 选择模板 4. 然后写入代码片段即可 上面的代码片段可以设置多个,看自己 重点关注的是 prefi…

spacy.load(“en_core_web_trf“)报错TypeError: issubclass() arg 1 must be a class

使用spacy时遇到的问题 写在最前面&#xff1a; 安装spacy和en_core_web_trf时需要保证二者版本一致 安装及查看对应spacy版本 安装 pip install spacy查看版本 import spacy spacy.__version__安装en_core_web_trf 直接安装&#xff08;如果可以的话&#xff09; pytho…

Nacos 下载运行及配置

Nacos 服务注册与配置中心&#xff0c;兼顾两者 文章目录 Nacos 服务注册与配置中心&#xff0c;兼顾两者一、简介二、相关文档2.1 Nacos官网2.2 官方文档 三、下载并运行Nacos3.1 下载压缩包3.2 解压缩3.3 运行命令3.4 访问Nacos控制台 附录&#xff1a;各种注册中心比较 Naco…

Java对象类型的转换+instanceOf判断对象类型

1.对象类型的转换 将子类的实例对象定义为父类类型&#xff0c;这种称为向上转型&#xff1b;将父类的实例对象定义为子类类型&#xff0c;这种称为向下转型&#xff0c;向下转型必须使用显示转换&#xff0c;否则编译器会报错。 1.1 向上转型 package classExtends;class Q…

关于A level真题的获取(持续更新中)

Edexcel考试局 Past papers | Past exam papers | Pearson qualifications 官方说明如下&#xff1a; For Teachers Question papers, mark schemes and examiner reports for the most recent exam sessions (within the last 12 months) can be accessed only by registe…

轻松学习Python:基础知识汇总

轻松学习Python:基础知识汇总 目录 轻松学习Python:基础知识汇总 本文章向大家介绍轻松学习Python:基础知识汇总,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 Python基础01 Hello World! Python命…

java经典面试题总结

1.请简述Java的继承&#xff0c;重写和多态的概念和运用 继承是一种Java中重要的面向对象编程方式&#xff0c;它允许一个类从另一个类继承某些属性和方法&#xff0c;在这种关系下&#xff0c;子类可以重写父类的方法&#xff0c;从而实现不同的行为。 多态是继承实现的一种关…