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

2023-09-21 20:00:50

一、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键对应的值为27
        if(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;
        }
    }

更多推荐

使用branch and bound分支定界算法选择UTXO

BnB算法原理分支定界算法始终围绕着一颗搜索树进行的,我们将原问题看作搜索树的根节点,从这里出发,分支的含义就是将大的问题分割成小的问题。大问题可以看成是搜索树的父节点,那么从大问题分割出来的小问题就是父节点的子节点了。分支的过程就是不断给树增加子节点的过程。而定界就是在分支的过程中检查子问题的上下界,如果子问题不能产

伦敦银一手是多少?

伦敦银是以国际现货白银价格为跟踪对象的电子合约交易,无论投资者通过什么地方的平台进入市场,执行的都是统一国际的标准,一手标准的合约所代表的就是5000盎司的白银,如果以国内投资者比较熟悉的单位计算,那约相当于15.5公斤的白银。至于一手伦敦银合约的总价值是多少,具体的数值会根据国际银价的波动而变化。如果以近期每盎司25

python经典百题之求数字位数及逆序打印

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字程序分析我们需要编写一个程序,能够接受不多于5位的正整数,然后分析其位数,并逆序打印出各位数字。可以利用取模和除法运算来实现逆序打印数字,同时通过不断除以10的方式确定位数。方法1:使用取模和除法defreverse_print(num):p

dvwa命令执行漏洞分析

dvwa靶场命令执⾏漏洞high难度的源码:$target=trim($_REQUEST[‘ip’]);是一个接收id值的变量array_keys()函数功能是返回包含原数组中所有键名的一个新数组。str_replace()函数如下,把字符串“Helloworld!”中的字符“world”替换为“Shanghai”:s

自然语言处理(一):基于统计的方法表示单词

文章目录1.共现矩阵2.点互信息3.降维(奇异值分解)1.共现矩阵将一句话的上下文大小窗口设置为1,用向量来表示单词频数,如:将每个单词的频数向量求出,得到如下表格,即共现矩阵:我们可以用余弦相似度(cosinesimilarity)来计算单词向量的相似性:similarity⁡(x,y)=x⋅y∥x∥∥y∥=x1y1

大模型训练为什么用A100不用4090

这是一个好问题。先说结论,大模型的训练用4090是不行的,但推理(inference/serving)用4090不仅可行,在性价比上还能跟H100打个平手。事实上,H100/A100和4090最大的区别就在通信和内存上,算力差距不大。H100A1004090TensorFP16算力1979Tflops312Tflops

React 全栈体系(七)

第四章Reactajax一、理解1.前置说明React本身只关注于界面,并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互(json数据)react应用中需要集成第三方ajax库(或自己封装)2.常用的ajax请求库jQuery:比较重,如果需要另外引入不建议使用axios:轻量级,建议使用封装X

Kotlin语言基础(二)-变量和数据类型

Kotlin语言基础-变量和数据类型一、Kotlin的变量Kotlin变量有两种形式var(variable)和val(value,取值)val定义只读量,一旦创建,其值不会发生变化例:vala=23那么对于a对应的值就只能是23,不会发生变化。如何试图对a重新赋值都会导致编译错误。var定义可变的变量,可以多次赋值修

【数据结构】堆的顺序结构及实现

目录一,堆的顺序结构二,堆的概念及结构三,堆的实现3.1堆的结构3.2堆的初始化3.3堆的插入数据3.3堆的删除数据3.4堆的取顶数据,返回堆数据大小,判断非空3.5堆的销毁四,总代码一,堆的顺序结构普通的二叉树是不适合用数组来存储的,因为可能存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们把堆(一种

Mybatis学习笔记8 查询返回专题

Mybatis学习笔记7参数处理专题_biubiubiu0706的博客-CSDN博客1.返回实体类2.返回List<实体类>3.返回Map4.返回List<Map>5.返回Map<String,Map>6.resultMap结果集映射7.返回总记录条数新建模块依赖目录结构1.返回实体类如果返回多条,用单个实体接收会出异

RHEL7 配置 LVM Mirror 创建共享卷

文章目录前言1.配置LVM镜像卷1.1.创建PV1.2.创建VG1.3.创建LV1.4.查看LV1.5.格式化文件系统1.6.创建挂载点并挂载1.7.写入测试数据2.切换LVM共享卷2.1.计划内切换2.1.1.检查I/O流量2.1.2.节点一卸载挂载点2.1.3.节点一禁用LV2.1.4.节点一禁用VG2.1.5.节

热文推荐