• QT连接OpenCV库实现人脸识别


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

    图像容器:Mat类

    读取图像:

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

     命名展示图像的窗口:

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

    展示图像:

    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. }

    二、视频流相关类和函数

    视频流类:VideoCapture

    打开视频:

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

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

    读取视频流中图像:

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

     图像翻转:

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

    休眠阻塞函数:

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

    均衡化处理:

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

    示例:

    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. Mat gray; //用于存储灰度图的图像容器
    13. Mat dst; //用于存储均衡化处理后的图像容器
    14. //函数原型:virtual bool read(OutputArray image);
    15. //功能:从视频流中读取一张图像放入参数中
    16. //参数:图像容器
    17. //返回值:成功返回真,失败或者读取视频结束返回假
    18. while(v.read(src))
    19. {
    20. //将图像进行翻转
    21. //函数原型:void flip(InputArray src, OutputArray dst, int flipCode);
    22. //参数1:要翻转的图像
    23. //参数2:翻转后的图像容器
    24. //参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转
    25. flip(src, src, 1);
    26. //3、将图像灰度处理
    27. //函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
    28. //参数1:要转换的图像
    29. //参数2:转换后的图像容器
    30. //参数3:转换规则 CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图
    31. //返回值:无
    32. cvtColor(src, gray, CV_BGR2GRAY);
    33. //4、对图像进行均衡化处理
    34. //函数原型:void equalizeHist( InputArray src, OutputArray dst );
    35. //参数1:要进行均衡化处理的图像,必须是单通道灰度图
    36. //参数2:均衡化处理后的图像容器
    37. //返回值:无
    38. equalizeHist(gray, dst);
    39. //展示彩色图像
    40. imshow("Test1", src);
    41. //展示灰度图像
    42. imshow("Test2", gray);
    43. //展示均衡化处理后的图像
    44. imshow("Test3", dst);
    45. //加延时函数
    46. //函数原型:int waitKey(int delay = 0);
    47. //参数:等待时间
    48. //返回值:在等待期间用户按下的键盘的ascii值 ESC键对应的值为27
    49. if(waitKey(20)==27)
    50. {
    51. break;
    52. }
    53. }
    54. return a.exec();
    55. }

    四、级联分类器

    opencv级联分类器工具类 : CascadeClassifier

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

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

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

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

    显示矩形区域:

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

    示例:

     

    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. Mat gray; //用于存储灰度图的图像容器
    13. Mat dst; //用于存储均衡化处理后的图像容器
    14. //5、实例化一个级联分类器的对象,用于找到图像中的人脸矩形区域
    15. CascadeClassifier c;
    16. //给类对象装载人脸识别模型
    17. //函数原型:bool load( const String& filename );
    18. //功能:给级联分类器对象,下载一个识别模型
    19. //参数:人脸识别模型的文件路径
    20. //返回值:成功下载返回真,失败返回假
    21. if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml"))
    22. {
    23. QMessageBox::information(NULL,"失败", "人脸识别模型装载失败");
    24. return -1;
    25. }
    26. //定义容器存放人脸分类后的矩形框
    27. vector faces;
    28. //函数原型:virtual bool read(OutputArray image);
    29. //功能:从视频流中读取一张图像放入参数中
    30. //参数:图像容器
    31. //返回值:成功返回真,失败或者读取视频结束返回假
    32. while(v.read(src))
    33. {
    34. //将图像进行翻转
    35. //函数原型:void flip(InputArray src, OutputArray dst, int flipCode);
    36. //参数1:要翻转的图像
    37. //参数2:翻转后的图像容器
    38. //参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转
    39. flip(src, src, 1);
    40. //3、将图像灰度处理
    41. //函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
    42. //参数1:要转换的图像
    43. //参数2:转换后的图像容器
    44. //参数3:转换规则 CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图
    45. //返回值:无
    46. cvtColor(src, gray, CV_BGR2GRAY);
    47. //4、对图像进行均衡化处理
    48. //函数原型:void equalizeHist( InputArray src, OutputArray dst );
    49. //参数1:要进行均衡化处理的图像,必须是单通道灰度图
    50. //参数2:均衡化处理后的图像容器
    51. //返回值:无
    52. equalizeHist(gray, dst);
    53. //6、使用级联分类器对象,获取人脸矩形区域
    54. //函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector& objects)
    55. //参数1:要进行识别的图像
    56. //参数2:对该图像识别后,的矩形框存放的数组容器
    57. c.detectMultiScale(dst, faces);
    58. //7、将上述得到的矩形框,全部都绘制到图像上
    59. for(int i=0; isize(); i++)
    60. {
    61. //将任意一个矩形框,全部都绘制到图像上
    62. //函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1)
    63. //参数1:要被绘制的图像
    64. //参数2:要绘制的矩形框
    65. //参数3:矩形框的颜色
    66. //参数4:矩形框的粗细
    67. //返回值:无
    68. rectangle(src, faces[i], Scalar(0,0,255), 2);
    69. }
    70. //8、像素反差
    71. for(int i=0; i//外层循环控制行数
    72. {
    73. for(int j=0; j//内层循环控制列数
    74. {
    75. //找到任意一个像素:src.at(i,j)
    76. //找到任意一个像素中的通道中的值src.at(i,j)[k]
    77. for(int k=0; k<3; k++)
    78. {
    79. src.at(i,j)[k] = 255 - src.at(i,j)[k]; //对像素进行反差
    80. }
    81. }
    82. }
    83. //展示彩色图像
    84. imshow("Test1", src);
    85. //展示灰度图像
    86. imshow("Test2", gray);
    87. //展示均衡化处理后的图像
    88. imshow("Test3", dst);
    89. //加延时函数
    90. //函数原型:int waitKey(int delay = 0);
    91. //参数:等待时间
    92. //返回值:在等待期间用户按下的键盘的ascii值 ESC键对应的值为27
    93. if(waitKey(20)==27)
    94. {
    95. break;
    96. }
    97. }
    98. return a.exec();
    99. }

  • 相关阅读:
    js 数组根据某个字段去重
    使用 .NET MAUI 创建移动应用——Get Start
    Python 爬虫使用 Selenium 如何在 WebElement 获得属性
    消息中间件篇之Kafka-数据清理机制
    【Java基础知识】
    跨平台应用开发进阶(二十三) :一文走近 testflight 上架
    今天公司来了个拿 30K 出来的测试,算是见识到了基础的天花板
    8张图解java
    day15_集合_ArrayList
    java-php-python-ssm-旅游网站vue-计算机毕业设计
  • 原文地址:https://blog.csdn.net/weixin_53478812/article/details/132699306