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


    一、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工程,将对应配置文件和头文件放入后,不报错就说明配置成功

    配置文件内容:

    1. INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include
    2. INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv
    3. INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv2
    4. LIBS += D:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

    头文件:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. using namespace cv;
    11. using namespace cv::face;
    12. using namespace std;

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

    1> Mat类,图像容器

    2> 读取图像

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

    3> 命名展示图像的窗口

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

    4> 展示图像

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

    案例

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

    1.3 视频流相关类和函数

    1> 视频流类:VideoCapture

    2> 打开视频:

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

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

    4> 读取视频流中图像

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

    5> 图像翻转

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

    6> 休眠阻塞函数

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

    案例:

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

    1.4 图像处理

    1> 灰度处理

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

    2> 均衡化处理

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

  • 相关阅读:
    Scikit-learn:全面概述
    不同规模的企业如何借助宁盾LDAP统一用户认证实现安全和效率需求?
    Golang 编译命令行
    网络安全从业人员能力图谱
    opencv的极线几何
    力扣 -- 494. 目标和(01背包问题)
    .NET 数据库大数据操作方案(插入、更新、删除、查询 、插入或更新)
    【JVM技术专题】针对于Java类加载器系统研究指南 「入门篇」
    Apache POI
    干洗店软件,洗鞋店收银管理系统小程序app
  • 原文地址:https://blog.csdn.net/weixin_54147737/article/details/133146226