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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69768.shtml

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

相关文章

10 个 效果不错的值得收藏的 css 代码片段

10 个 css 代码片段 以下这 10 个常用的 css 代码片段值得收藏&#xff0c;都可以用于平常的业务代码当中。 1. 点点点加载中效果 这是一个兼容性不错的用户体验很棒的点点点加载效果&#xff0c;实现思路如下: 使用自定义的标签元素 dot。将 dot 元素设置为内联元素(displ…

房地产推广传单制作攻略,打造让人惊艳的电子传单

随着互联网的发展&#xff0c;传统的纸质传单已经逐渐被电子版传单所取代。电子版传单不仅可以节省成本&#xff0c;还可以更好地展示房产信息。在传统的设计软件中制作电子版传单需要一定的门槛&#xff0c;但是现在有了乔拓云网的后台&#xff0c;设计电子版房产H5传单变得简…

TCP机制之确认应答及超时重传

TCP因为其可靠传输的特性被广泛使用,这篇博客将详细介绍一下TCP协议是如何保证它的可靠性的呢?这得主要依赖于其确认应答及超时重传机制,同时三次握手四次挥手也起到了少部分不作用,但是主要还是由确认应答和超时重传来决定的;注意:这里的可靠传输并不是说100%能把数据发送给接…

log4j日志配置

<?xml version"1.0" encoding"UTF-8"?> <!--设置log4j2的自身log级别为warn--> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status&…

无涯教程-Android - Absolute Layout函数

Absolute Layout 可让您指定其子级的确切位置(x/y坐标)&#xff0c;绝对布局的灵活性较差且难以维护。 Absolute Layout - 属性 以下是AbsoluteLayout特有的重要属性- Sr.NoAttribute & 描述1 android:id 这是唯一标识布局的ID。 2 android:layout_x 这指定视图的x坐标…

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(上)

前言 今天&#xff0c;小编我也要进入计算机网络的整个内容&#xff0c;虽然这个计算机网络的内容在考研部分中占比比较小&#xff0c;有些人不把这一部分当成重点&#xff0c;这种想法是错误的。我觉得考研的这四个内容都是非常重要的&#xff0c;我们需要进行全力以赴的对待每…

Redis:StringRedisTemplate简介

&#xff08;笔记总结自b站黑马程序员课程&#xff09; 为了在反序列化时知道对象的类型&#xff0c;JSON序列化器会将类的class类型写入json结果中&#xff0c;存入Redis&#xff0c;会带来额外的内存开销。 为了减少内存的消耗&#xff0c;我们可以采用手动序列化的方式&am…

【数据结构】堆的基础功能实现与PriorityQueue

文章目录 &#x1f340;堆的插入与删除&#x1f6eb;堆的插入&#x1f6a9;代码实现&#xff1a; &#x1f6ec;堆的删除 &#x1f38b;堆的常见习题&#x1f388;习题一&#x1f388;习题二&#x1f388;习题三 &#x1f384;PriorityQueue&#x1f431;‍&#x1f453;Priori…

2023高教社杯国赛数学建模C题思路+模型+代码(9.7晚开赛后第一时间更新)

目录 1.C题思路模型&#xff1a;9.7晚上比赛开始后&#xff0c;第一时间更新&#xff0c;获取见文末名片 2.竞赛注意事项&#xff1a;包括比赛流程&#xff0c;任务分配&#xff0c;时间把控&#xff0c;论文润色&#xff0c;已经发布在文末名片中 3.常用国赛数学建模算法 …

添加.net core web Api 对XML数据格式的支持

默认情况下WebApi 返回的数据类型是Json格式的数据&#xff0c;XML请求的也会返回json格式&#xff0c;这显然不是我们想要的 MvcOptions.ReturnHttpNotAcceptable的默认值为false, 此时&#xff0c;如果服务器端不支持http request中Accept的格式值&#xff0c;比如applicati…

leetcode 92.反转链表II dummy节点的应用

题目 方法 dummy节点 链表的第一个结点&#xff0c;因为没有前驱结点&#xff0c;存在同时删除前驱和后继的情况&#xff0c;这时候我们需要人为构造dummy节点——人为制造出来的第一个结点的前驱结点&#xff0c;也就是说&#xff0c;在可能操作head节点时&#xff0c;我们可…

基于Matlab分析的电力系统可视化研究

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

4.正则提取html中的img标签的src内容

我们以百度贴吧的1吧举例 目录 1 把网页搞下来 2 收集url 3 处理url 4 空的src 5 容错 6 不使用数字作为文件名 7 并不是所有的图片都用img标签表示 8 img标签中src请求下来不一定正确 9 分页 1 把网页搞下来 搞下来之后&#xff0c;双击打开是这样的 2 收…

MySQL5.7慢查询实践

总结 获取慢查询SQL 已经执行完的SQL&#xff0c;检查慢查询日志&#xff0c;日志中有执行慢的SQL正在执行中的SQL&#xff0c;show proccesslist;&#xff0c;结果中有执行慢的SQL 慢查询日志关键参数 名称解释Query_time查询消耗时间Time慢查询发生时间 分析慢查询SQL e…

Linux开源防病毒引擎ClamAV

ClamAV官方地址&#xff1a;https://www.clamav.net 它支持Linux、BSD、windows、Mac OS X等系统。 在CentOS 8&#xff08;Tencent OS 3.1&#xff09;安装非常便利&#xff0c;可以使用yum。 yum install clamav 安装成功&#xff0c;就可以使用它进行病毒扫描检查了。 c…

ArcGIS Engine10.2 Setup 报错

00 问题重述 当我尝试安装ArcGIS Engine时弹出错误&#xff1a;ArcGIs 10,2 Engine cannot be installed on your machine.ArcGIs 10,2 Engine requires Microsoft ,NET Framework 3.5sp1, Which has not been found on your system, If you want to download and install Mic…

使用Flask编写一个最简单的后端接口

文章目录 一、Flask简介二、Flask与Django的对比三、一个最简单的例子 一、Flask简介 Flask是一个轻量级的Python Web框架&#xff0c;它使用Python语言编写&#xff0c;并且使用MVC模式进行开发。Flask被称为微框架&#xff0c;但这并不意味着它只能处理小型应用程序&#xf…

算法训练day34|贪心算法 part03(LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果(处理一边再处理一边))

文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接&#x1f525; 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#…

Android样本Repack重打包检测思路

1. 什么是Android样本重打包&#xff0c;为什么要检测重打包 &#xff08;1&#xff09;apk是zip&#xff0c;很容易做repack &#xff08;2&#xff09;repack后&#xff0c;被抄袭&#xff0c;redirect ad&#xff0c;或者插入malicious payloads &#xff08;3&#xff09;…

C++ Windows Socket 简单示例

服务端 #include <iostream> #include <WinSock2.h>#pragma comment(lib,"ws2_32.lib") #pragma warning(disable:4996)#define SERVICE_IP "192.168.X.X" #define SERVICE_PORT (1024 256) #define SERVICE_BUFFER_SIZE 1024int main() {//…