2023/9/21 -- C++/QT

news/2024/12/23 6:40:18/

一、QT连接OpenCV库完成人脸识别

1.1 相关的配置

1> 该项目所用环境:qt-opensource-windows-x86-mingw491_opengl-5.4.0

2> 配置opencv库路径:

1、在D盘下创建一个opencv的文件夹,用于存放所需材料

2、在opencv的文件夹下创建一个名为:opencv3.4-qt-intall 文件夹

3、将资料中的opencv_library的install文件,复制到opencv3.4-qt-intall 文件夹中

4、将路径:D:\opencv\opencv3.4-qt-intall\install\x86\mingw\bin 放入电脑的系统路径中

3> 测试是否配置好

创建一个新的qt工程,将对应配置文件和头文件放入后,不报错就说明配置成功

配置文件内容:

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

头文件:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include<opencv2/face.hpp>
#include <vector>#include <QMessageBox>
#include <QDebug>
#include <QFile>#include <QTimerEvent>using namespace  cv;
using namespace cv::face;
using namespace std;

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

1> Mat类,图像容器

2> 读取图像

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

3> 命名展示图像的窗口

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

4> 展示图像

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

1.3 视频流相关类和函数

1> 视频流类:VideoCapture

2> 打开视频:

 virtual bool open(const String& filename);//参数:要打开视频的路径//返回值:成功返回true失败返回false

3> 打开摄像头只需在构造时,调用构造函数参数传递0即可

4> 读取视频流中图像

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

5> 图像翻转

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

6> 休眠阻塞函数

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

1.4 图像处理

1> 灰度处理

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

2> 均衡化处理

void equalizeHist( InputArray src, OutputArray dst ); 
参数1:输入的灰度图像,必须是8-bit的单通道图像  
参数2:输出的图像 
图像直方图:对整个图像在灰度范围内的像素值(0-255)统计出现的频率,据此生成直方图,直 方图反应了图像的灰度分布情况。
    //1、实例化一个Mat对象Mat src;            //存放原图Mat gray;              //存放灰度图//2、实例化一个视频流对象,用于管理视频VideoCapture v;//3、打开视频//if(!v.open("D:\\opencv\\resources\\01.mp4"))            //打开指定的文件视频if(!v.open(0))                                        //打开摄像头{QMessageBox::information(this, "失败", "视频打开失败");return ;}//4、读取视频while(v.read(src)){//将图像进行翻转flip(src, src, 1);//灰度处理cvtColor(src, gray, CV_BGR2GRAY);//展示读取的这一帧图像imshow("Test1", src);imshow("Test2", gray);//延时函数//函数原型:int waitKey(int delay = 0);//功能:延时等待用户操作键盘//参数:延时时长,以毫秒为单位//返回值:等待过程中用户敲下键盘的键值if(waitKey(20) == 27){break;}}


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

相关文章

【人工智能】机器学习的入门与提升

目录 1.入门 1.1.从何处开始 1.2.数据集 1.3.数据类型 2.平均中位数模式 2.1.均值、中值和众数 2.2.均值 2.2.1.实例 2.2.2.运行结果 2.3.中值 2.3.1.实例 2.3.2.运行结果 2.3.3.实例 2.3.4.运行结果 2.4.众数 2.4.1.实例 2.4.2.运行结果 2.5.章节总结 3.标准…

使用多线程实现批处理过程

使用多线程实现批处理过程&#xff0c;将一下数组&#xff0c;按10个一组&#xff0c;每组一个打印数据&#xff0c;并在19个线程都处理完成后输出打印次数 int[]data new int [100]; for(int i0;i <100;i){data[i] i;} import java.util.concurrent.CountDownLatch;public…

C. Tea Tasting

Problem - C - Codeforces 问题描述&#xff1a;n个人杯茶。第一个数组a表示第i杯茶有ai毫升&#xff0c;第二个数组b表示&#xff0c;第i个人品尝茶的毫升ai。总共会进行n轮品茶&#xff0c;在第j轮中&#xff0c;第i个人会品第i - j 1杯茶bi毫升&#xff0c;之后ai减少bi&a…

解决GOSUMDB sum.golang.org 连接超时

$ go get github.com/mutecomm/go-sqlcipher/v4 github.com/mutecomm/go-sqlcipher/v4v4.4.2: verifying module: missing GOSUMDB 原因&#xff1a; 首先需要弄懂&#xff0c;执行以上提到的两个命令时&#xff0c;除了会从 GOPROXY 下载压缩包&#xff0c;还会调用 GOSUMDB…

Seata流程源码梳理下篇-TC

我们上篇简单梳理了下TM、RM的一些流程&#xff08;离现在过得挺久的了&#xff0c;这篇我们这篇来梳理下TC的内容。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定…

数据预处理方式合集

删除空行 #del all None value data_all.dropna(axis1, howall, inplaceTrue) 删除空列 #del all None value data_all.dropna(axis0, howall, inplaceTrue) 缺失值处理 观测缺失值 观测数据缺失值有一个比较好用的工具包——missingno&#xff0c;直接传入DataFrame&…

使用NRM管理Node镜像源,提升包下载速度

前言 在日常开发中&#xff0c;我们经常会使用到Node.js来构建和运行JavaScript应用程序。然而&#xff0c;在使用Node.js时&#xff0c;由于网络环境的限制&#xff0c;我们可能会遇到包下载速度缓慢的问题。为了解决这个问题&#xff0c;本文将介绍如何使用NRM&#xff08;N…

内核和用户空间中的TID,GID, PID,uid

要获取关于eBPF中的进程信息&#xff0c;可以使用以下函数: bpf_get_current_pid_tgid()、 bpf_get_current_uid_gid()、 bpf_get_current_comm(char *buf, int size_of_buf)。 当程序被绑定到对某个内核函数调用时&#xff0c;就可以使用它们。UID/GID应该比较明确&#xff0c…