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

news2024/10/4 10:22:35

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

实现结果:

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

代码:

pro:

#-------------------------------------------------
#
# Project created by QtCreator 2023-10-23T16:19:56
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = demo4
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

INCLUDEPATH += 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_OBJECT

public:
    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转化位rgb
        cvtColor(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轴翻转

        //定义一个QImage
        QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
        //放入label
        ui->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.coloradmin.cn/o/1124897.html

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

相关文章

通过热敏电阻计算温度(二)---ODrive实现分析

文章目录 通过热敏电阻计算温度&#xff08;二&#xff09;---ODrive实现分析测量原理图计算分析计算拟合的多项式系数根据多项式方程计算温度的函数温度计算调用函数 通过热敏电阻计算温度&#xff08;二&#xff09;—ODrive实现分析 ODrive计算热敏电阻的温度采用的时B值的…

计算机基础知识37

针对记录的SQL语句 记录: 表中的一行一行的数据称之为是一条记录 先有库---->表---->记录 C:\Users\26647>mysql -u root -p # 先登录 mysql> show databases&#xff1b; # 查看所有库 mysql> create database db1; # 创造库 mysql> use db1; # 引用…

Java逻辑运算符(、||和!),Java关系运算符

逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式&#xff0c;以判断程序中的表达式是否成立&#xff0c;判断的结果是 true 或 false。 逻辑运算符是对布尔型变量进行运算&#xff0c;其结果也是布尔型&#xff0c;具体如表 1 所示。 表 1 逻辑运算符的用…

科大讯飞星火认知大模型

哈喽&#xff0c;大家好&#xff01; 前段时间「科大讯飞版ChatGPT」上线&#xff0c;给大家推荐了一波&#xff0c;演示了其强大的功能&#xff0c;不少小伙伴都立马申请体验了一把&#xff0c;也有私信说非常强大&#xff0c;工作效率提高不少&#xff0c;支持国产大模型&am…

【Python · PyTorch】数据基础

数据基础 1. 数据操作1.1 入门1.2 运算符1.3 广播机制1.4 索引和切片1.5 节省内存1.6 转化为其他Python对象 2. 数据预处理2.1 读取数据集2.2 处理缺失值2.3 转换为张量格式 本文介绍了PyTorch数据基础&#xff0c;Python版本3.9.0&#xff0c;代码于Jupyter Lab中运行&#xf…

linux系统安装jdk

1.从官网下载jdk包,Java Archive Downloads - Java SE 8u211 and later 2.创建java目录并上传jdk包 mkdir -p /home/local/java 3.解压jdk包 cd /home/local/java tar -zxvf /home/local/java/jdk-8u381-linux-x64.tar.gz 4.配置环境变量 vim /etc/profile i export JAV…

关于数据可视化那些事

干巴巴的数据没人看&#xff0c;数据可视化才能直观展现数据要点&#xff0c;提升数据分析、数字化运营决策效率。那关于可视化的实现方式、技巧、工具等&#xff0c;你了解几分&#xff1f;接下来&#xff0c;我们就来聊聊数据可视化那些事。 1、什么是数据可视化&#xff1f…

酒精壁炉:独特的室内取暖方式

酒精壁炉是一种现代而引人注目的室内取暖方式&#xff0c;其独特之处在于使用酒精作为唯一的燃料源。这种现代壁炉设计旨在为家庭带来温暖和舒适&#xff0c;同时呈现出简约而时尚的外观。 1、无需烟囱的壁炉 传统壁炉通常需要烟囱或排气系统&#xff0c;以排除燃烧过程中产生…

Java赋值运算符(=)

赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“”&#xff0c;它是双目运算符&#xff0c;左边的操作数必须是变量&#xff0c;不能是常量或表达式。 其语法格式如下所示&#xff1a; 变量名称表达式内容 在 Java 语言中&#xff0c;“变量名称”和“表达式…

RISC-V架构——物理内存保护机制设置函数(pmp_set)解析

1、物理内存保护机制 参考博客&#xff1a;《RISC-V架构——物理内存属性和物理内存保护》&#xff1b; 2、pmp_set函数源码 int pmp_set(unsigned int n, unsigned long prot, unsigned long addr,unsigned long log2len) {int pmpcfg_csr, pmpcfg_shift, pmpaddr_csr;unsign…

【C++和数据结构】位图和布隆过滤器

目录 一、位图 1、位图的概念 2、位图的实现 ①、基本结构 ②、set ③、reset&#xff1a; ④、test ⑤、问题&#xff1a; ⑥、位图优缺点及应用&#xff1a; ⑦、完整代码及测试 二、布隆过滤器 1、布隆过滤器的提出 2、布隆过滤器的实现 ①、基本结构 ②…

初识测开/测试

前言 在进入软件测试的正式讲解之前&#xff0c;我们需要对这个行业有一个整体的了解。 当我们从软件开发转向软件测试的时候&#xff0c;多数公司是欢迎的&#xff0c;而且难度也小。 反之&#xff0c;当我们从软件测试转向软件开发的时候&#xff0c;难度将会变得很大。 关于…

《持续交付:发布可靠软件的系统方法》- 读书笔记(七)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;七&#xff09; 第 7 章 提交阶段7.1 引言7.2 提交阶段的原则和实践7.2.1 提供快速有用的反馈7.2.2 何时令提交阶段失败7.2.3 精心对待提交阶段7.2.4 让开发人员也拥有所有权7.2.5 在超大项目团队中指定一个构建负责人 …

Mock测试详细教程入门这一篇就够了!

1、什么是mock测试 1.png Mock测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的比较复杂的数据/场景&#xff0c;用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。 2、为什么要进行Mock测试 Mock是为了解决不同的单元之间由于耦合而难于开发、测试…

01-React入门

React概述 react是什么&#xff1f; React用于构建用户界面的JS库。是一个将数据渲染为HTML视图的开源JS库。 为什么学&#xff1f; 1.原生JS操作DOM繁琐&#xff0c;效率低 2.使用JS直接操作DOM,浏览器会进行大量的重绘重排 3.原生JS没有组件化编码方案&#xff0c;代码…

【GA-LSSVM预测】基于遗传算法优化最小二乘支持向量机的回归预测(MATLAB代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数字化转型如何影响企业全要素生产率(2007-2022年)

参照赵宸宇等&#xff08;2021&#xff09;的做法&#xff0c;本团队对来自财贸经济《数字化转型如何影响企业全要素生产率》一文中的基准回归部分进行复刻 一、数据介绍 数据名称&#xff1a;数字化转型如何影响企业全要素生产率 数据范围&#xff1a;上市公司 数据年份&am…

NSSCTF第8页(2)

[LitCTF 2023]就当无事发生 没有环境 [MoeCTF 2022]ezhtml 在js代码找到了flag [HNCTF 2022 WEEK2]ez_ssrf 题目描述说让我们访问index.php,看到了代码 传入的data会base64解码&#xff0c;传参port和host&#xff0c;还有一个没见过的函数fsockopen 查了一下 fsockopen函…