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

QT连接OpenCV库实现人脸识别

一、关于图像处理的相关类和函数

图像容器:Mat类

读取图像:

Mat imread( const String& filename, int flags = IMREAD_COLOR );
功能:读取出图像
参数:图像路径
返回值:读取的图像

 命名展示图像的窗口:

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
功能:命名一个图像窗口
参数1:窗口名称
参数2:窗体尺寸,默认为自适应大小
返回值:无

展示图像:

void imshow(const String& winname, const ogl::Texture2D& tex);
功能:展示图像
参数1:要展示图像的窗口名称
参数2:要展示的二维图像
返回值:无

示例:

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义一个图像容器Mat src;//2、将图像加载进来//函数原型:Mat imread( const String& filename, int flags = IMREAD_COLOR );//参数:图像的路径//返回值:图像容器src = imread("D:/opencv/resource/age.jpg");//4、命名一个展示图像的窗口//namedWindow("Test");//5、展示图像//函数原型:void imshow(const String& winname, const ogl::Texture2D& tex);//参数1:要展示图像的窗口名称//参数2:要展示的图像//返回值:无imshow("Test", src);return a.exec();
}

二、视频流相关类和函数

视频流类: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轴翻转,-1表示沿xy轴翻转

休眠阻塞函数:

int waitKey(int delay = 0);
功能:阻塞等待用户输入数据,如果delay=0,则一直等待
参数:毫秒数
返回值:在等待过程中用户按下键的值

示例:

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义视频流对象VideoCapture v(0);             //表明使用摄像头构造一个视频流对象//2、读取摄像头中的图像Mat src;                   //用于存放读取出来的图像//函数原型:virtual bool read(OutputArray image);//功能:从视频流中读取一张图像放入参数中//参数:图像容器//返回值:成功返回真,失败或者读取视频结束返回假while(v.read(src)){//将图像进行翻转//函数原型:void flip(InputArray src, OutputArray dst, int flipCode);//参数1:要翻转的图像//参数2:翻转后的图像容器//参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转flip(src, src, 1);//展示图像imshow("Test1", src);//加延时函数//函数原型:int waitKey(int delay = 0);//参数:等待时间//返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27if(waitKey(20)==27){break;}}return a.exec();
}

三、图像处理

灰度处理:

void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
功能:转换图像色彩空间
参数1:要转换的图像
参数2:转变后图像容器
参数3:转换规则:BGR to gray
返回值:无

均衡化处理:

void equalizeHist( InputArray src, OutputArray dst ); 
参数1:输入的灰度图像,必须是8-bit的单通道图像  
参数2:输出的图像 
图像直方图:对整个图像在灰度范围内的像素值(0-255)统计出现的频率,据此生成直方图,直方图反应了图像的灰度分布情况。

示例:

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义视频流对象VideoCapture v(0);             //表明使用摄像头构造一个视频流对象//2、读取摄像头中的图像Mat src;                   //用于存放读取出来的图像Mat gray;                   //用于存储灰度图的图像容器Mat dst;                     //用于存储均衡化处理后的图像容器//函数原型:virtual bool read(OutputArray image);//功能:从视频流中读取一张图像放入参数中//参数:图像容器//返回值:成功返回真,失败或者读取视频结束返回假while(v.read(src)){//将图像进行翻转//函数原型:void flip(InputArray src, OutputArray dst, int flipCode);//参数1:要翻转的图像//参数2:翻转后的图像容器//参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转flip(src, src, 1);//3、将图像灰度处理//函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );//参数1:要转换的图像//参数2:转换后的图像容器//参数3:转换规则  CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图//返回值:无cvtColor(src, gray, CV_BGR2GRAY);//4、对图像进行均衡化处理//函数原型:void equalizeHist( InputArray src, OutputArray dst );//参数1:要进行均衡化处理的图像,必须是单通道灰度图//参数2:均衡化处理后的图像容器//返回值:无equalizeHist(gray, dst);//展示彩色图像imshow("Test1", src);//展示灰度图像imshow("Test2", gray);//展示均衡化处理后的图像imshow("Test3", dst);//加延时函数//函数原型:int waitKey(int delay = 0);//参数:等待时间//返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27if(waitKey(20)==27){break;}}return a.exec();
}

四、级联分类器

opencv级联分类器工具类 : CascadeClassifier

加载级联分类器配置文件 :

bool load( const String& filename ) 
参数1:分类器数据文件的名字
返回值:成功true,失败false

找到人脸所在位置的矩形区域:

void detectMultiScale(
const Mat& image, 
CV_OUT vector& objects,
double scaleFactor = 1.1,
int minNeighbors = 3, 
int flags = 0, 
Size ize = Size(24,24))
参数1:待检测灰度图像(数据少处理起来简单) 
参数2:被检测物体的矩形框向量( 人脸Rect矩形区域,其中objects.size()是人脸个数 ) 
参数3:前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10% 
参数4:构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于 minneighbors - 1 都会被除 
参数5:若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多 或过少的区域,,一般采用默认值0 
参数6:用来限制得到的目标区域的范围,一般检测人脸使用Size(24, 24)

显示矩形区域:

void rectangle(
CV_IN_OUT Mat& img, 
Rect rec,
const Scalar& color, 
int thickness = 1,
int lineType = LINE_8, 
int shift = 0);img:图像。 
rec:表征矩形的位置和长宽。 
color:线条颜色 (RGB) 。 
thickness:组成矩形的线条的粗细程度。 
line_type:线条的类型。 
shift:坐标点的小数点位数,0表示没有小数点。

示例:

 

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义视频流对象VideoCapture v(0);             //表明使用摄像头构造一个视频流对象//2、读取摄像头中的图像Mat src;                   //用于存放读取出来的图像Mat gray;                   //用于存储灰度图的图像容器Mat dst;                     //用于存储均衡化处理后的图像容器//5、实例化一个级联分类器的对象,用于找到图像中的人脸矩形区域CascadeClassifier c;//给类对象装载人脸识别模型//函数原型:bool load( const String& filename );//功能:给级联分类器对象,下载一个识别模型//参数:人脸识别模型的文件路径//返回值:成功下载返回真,失败返回假if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml")){QMessageBox::information(NULL,"失败", "人脸识别模型装载失败");return -1;}//定义容器存放人脸分类后的矩形框vector<Rect> faces;//函数原型:virtual bool read(OutputArray image);//功能:从视频流中读取一张图像放入参数中//参数:图像容器//返回值:成功返回真,失败或者读取视频结束返回假while(v.read(src)){//将图像进行翻转//函数原型:void flip(InputArray src, OutputArray dst, int flipCode);//参数1:要翻转的图像//参数2:翻转后的图像容器//参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转flip(src, src, 1);//3、将图像灰度处理//函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );//参数1:要转换的图像//参数2:转换后的图像容器//参数3:转换规则  CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图//返回值:无cvtColor(src, gray, CV_BGR2GRAY);//4、对图像进行均衡化处理//函数原型:void equalizeHist( InputArray src, OutputArray dst );//参数1:要进行均衡化处理的图像,必须是单通道灰度图//参数2:均衡化处理后的图像容器//返回值:无equalizeHist(gray, dst);//6、使用级联分类器对象,获取人脸矩形区域//函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector<Rect>& objects)//参数1:要进行识别的图像//参数2:对该图像识别后,的矩形框存放的数组容器c.detectMultiScale(dst, faces);//7、将上述得到的矩形框,全部都绘制到图像上for(int i=0; i<faces.size(); i++){//将任意一个矩形框,全部都绘制到图像上//函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1)//参数1:要被绘制的图像//参数2:要绘制的矩形框//参数3:矩形框的颜色//参数4:矩形框的粗细//返回值:无rectangle(src, faces[i], Scalar(0,0,255), 2);}//8、像素反差for(int i=0; i<src.rows; i++)        //外层循环控制行数{for(int j=0; j<src.cols; j++)        //内层循环控制列数{//找到任意一个像素:src.at<Vec3b>(i,j)//找到任意一个像素中的通道中的值src.at<Vec3b>(i,j)[k]for(int k=0; k<3; k++){src.at<Vec3b>(i,j)[k] = 255 - src.at<Vec3b>(i,j)[k];  //对像素进行反差}}}//展示彩色图像imshow("Test1", src);//展示灰度图像imshow("Test2", gray);//展示均衡化处理后的图像imshow("Test3", dst);//加延时函数//函数原型:int waitKey(int delay = 0);//参数:等待时间//返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27if(waitKey(20)==27){break;}}return a.exec();
}

相关文章:

QT连接OpenCV库实现人脸识别

一、关于图像处理的相关类和函数 图像容器&#xff1a;Mat类 读取图像&#xff1a; Mat imread( const String& filename, int flags IMREAD_COLOR ); 功能&#xff1a;读取出图像 参数&#xff1a;图像路径 返回值&#xff1a;读取的图像 命名展示图像的窗口&#xff…...

基于SSM+Vue的网上花店系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

两种解法解决 LeetCode 27. 移除元素【C++】

移除元素 27. 移除元素题目&#xff1a;[移除元素](https://leetcode.cn/problems/remove-element/description/)示例和提示&#xff1a;解法&#xff1a;1. 暴力解法 2. 快慢指针 27. 移除元素 题目&#xff1a;移除元素 示例和提示&#xff1a; 解法&#xff1a; 1. 暴力解…...

Vue + Element UI 前端篇(七):功能组件封装

组件封装 为了避免组件代码的臃肿&#xff0c;这里对主要的功能部件进行封装&#xff0c;保证代码的模块化和简洁度。 组件结构 组件封装重构后&#xff0c;试图组件结构如下图所示 代码一览 Home组件被简化&#xff0c;包含导航、头部和主内容三个组件。 Home.vue <te…...

QT QToolBox控件使用详解

本文详细的介绍了QToolBox控件的各种操作&#xff0c;例如&#xff1a;新建界面、添加页签、索引设置当前项、获取当前项的索引、获取当前项窗口、获取索引值是int的窗口、移除索引值项、获取项的数量、获取指定索引值、设置索引项是否激活、获取索引值项是否激活、设置项的图标…...

数学建模--主成分分析法(PCA)的Python实现(

目录 1.算法核心思想&#xff1a; 2.算法核心代码&#xff1a; 3.算法分类效果&#xff1a; 1.算法核心思想&#xff1a; 1.设置降维后主成分的数目为2 2.进行数据降维 3.设置main_factors1个划分类型 4.根据组分中的值进行分类 5.绘制出对应的图像 2.算法核心代码&#xff1a…...

【数据结构篇】线性表2 —— 栈和队列

前言&#xff1a;上一篇我们介绍了顺序表和链表 &#xff08;https://blog.csdn.net/iiiiiihuang/article/details/132615465?spm1001.2014.3001.5501&#xff09;&#xff0c; 这一篇我们将介绍栈和队列&#xff0c;栈和队列都是基于顺序表和链表来实现的 目录 栈&#xff…...

万物互联:软件与硬件的协同之道

在当今数字化时代&#xff0c;我们身边的一切似乎都与计算机和互联网有关。从智能手机到智能家居设备&#xff0c;从自动驾驶汽车到工业生产线&#xff0c;无论我们走到哪里&#xff0c;都能看到软件和硬件的协同作用。本文将探讨这种协同作用&#xff0c;解释软件和硬件如何相…...

ping: www.baidu.com: Name or service not known 写了DNS还是不行

环境描述&#xff1a;ESXI平台上&#xff0c;一台Centos7虚拟主机。 问题描述&#xff1a;平台上的其他的虚拟机可以正常ping通&#xff0c;就这台ping IP地址可以通&#xff0c;ping域名解析失败。 排查过程&#xff1a; 1、检查网卡配置文件和/etc/resolv.conf配置文件是否…...

C++中的decltype、std::declval 和 std::decay_t傻傻分不清楚

文章目录 前言它们是什么通俗解释总结 前言 在C中提到推导第一个映入脑海的可能是“模板”&#xff0c;当然有人也可能想到 auto&#xff0c;这些都是和推导相关的语言语法&#xff0c;再比如“完美转发”等等&#xff0c;总是就是他们的类型不用明明白白的写出来&#xff0c;…...

什么是Ubuntu LTS?与常规版本的区别

Ubuntu LTS&#xff08;Long-Term Support&#xff09;是Ubuntu操作系统的一个特殊版本&#xff0c;旨在提供更长时间的支持和稳定性。与常规的Ubuntu版本相比&#xff0c;LTS版本在以下几个方面有所不同&#xff1a; 支持周期更长&#xff1a; 使用Ubuntu LTS版本&#xff0c…...

如何写一个可以找到工作的简历不至于太烂

简历是自己的一个很重要的标签&#xff0c;是获得面试的敲门砖&#xff0c;简历是要时常更新的&#xff0c;否则会错过一些机会。简历也是给自己的正反馈。 方法 ● 模仿&#xff0c;例如Boss&#xff0c;拉钩下面都给你一个案例模板供你参考&#xff0c;但是我觉得其实参考性…...

el-select 使用

案例&#xff1a; /* * label : 界面上展示的是哪个字段,我这里需要展示名称 * value : 绑定的字段&#xff0c;一般是id */<el-selectv-model"Form.BillNumber"placeholder"请选择"change"changeValue($event)"><el-optionv-for"…...

思维导图怎么变成ppt?4个思维导图一键生成ppt的方法

做好的思维导图如何变成一份ppt&#xff1f;本文罗列了4个可行方法&#xff0c;一起来看看吧。 一 直接复制粘贴 这是最简单的方法&#xff0c;虽然这样可能会花费一些时间&#xff0c;但可以确保内容排版和布局与你想要的一致。当然&#xff0c;我们大可使用更高效的方法。…...

3D点云处理:点云投影为2D图像 调平点云(附源码)

文章目录 0. 测试效果1. 基本内容1.1 计算点云位姿1.2 调平点云1.3 点云投影2. 代码实现文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_0. 测试效果...

mysql 查询优化 、索引失效

查询优化 物理查询优化 通过索引和表连接方式等技术来进行优化&#xff0c;这里重点需要掌握索引的使用 逻辑查询优化 通过SQL 等价变换 提升查询效率&#xff0c;直白一点就是说&#xff0c;换一种查询写法执行效率可能更高 索引失效 计算、函数、类型转换&#xff08;自动或…...

支付宝pc支付(springboot版),简单配置即可实现支付

概述 支付宝pc支付&#xff0c;只需要修改配置就可以实现支付&#xff0c;0基础小白都可以用。使用springboot编写&#xff0c;简单易用。 详细 DEMO简介 springboot整合支付宝pc支付&#xff0c;仅仅需要少量的配置&#xff0c;就可以实现pc支付。 项目截图 支付流程 用户…...

【Redis专题】Redis持久化、主从与哨兵架构详解

目录 前言课程目录一、Redis持久化1.1 RDB快照&#xff08;Snapshot&#xff09;&#xff1a;二进制文件基本介绍开启/关闭方式触发方式bgsave的写时复制&#xff08;COW&#xff0c;Copy On Write&#xff09;机制优缺点 1.2 AOF&#xff08;append-only file&#xff09;&…...

【vue2第十三章】自定义指令 自定义v-loading指令

自定义指令 像 v-html&#xff0c;v-if&#xff0c;v-for都是vue内置指令&#xff0c;而我们也可以封装自定义指令&#xff0c;提升编码效率。 什么是自定义指令&#xff1f; 自己定义的一些指令&#xff0c;可以进行一些dom操作&#xff0c;扩展格外的功能。比如让图片懒加载…...

数据结构--6.3查找算法(静态、动态)(插值查找)

静态查找&#xff1a;数据集合稳定&#xff0c;不需要添加&#xff0c;删除元素的查找操作。 动态查找&#xff1a;数据集合在查找的过程中需要同时添加或删除元素的查找操作。 对于静态查找来说&#xff0c;我们不妨可以用线性表结构组织数据&#xff0c;这样可以使用顺序查找…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

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

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

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...