• QTday06(人脸识别项目前置知识)


    qt版本5.4.0:旧版本的qt,为啥要用旧版本的我也不知道

    实现结果:

    调用系统摄像头,用红框框住画面中的人头

    代码:

    pro:

    1. #-------------------------------------------------
    2. #
    3. # Project created by QtCreator 2023-10-23T16:19:56
    4. #
    5. #-------------------------------------------------
    6. QT += core gui
    7. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    8. TARGET = demo4
    9. TEMPLATE = app
    10. SOURCES += main.cpp\
    11. widget.cpp
    12. HEADERS += widget.h
    13. FORMS += widget.ui
    14. INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include
    15. INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv
    16. INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv2
    17. LIBS += D:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

    h:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. #include
    17. #include
    18. using namespace cv;
    19. using namespace cv::face;
    20. using namespace std;
    21. namespace Ui {
    22. class Widget;
    23. }
    24. class Widget : public QWidget
    25. {
    26. Q_OBJECT
    27. public:
    28. explicit Widget(QWidget *parent = 0);
    29. ~Widget();
    30. private slots:
    31. void on_openBtn_clicked();
    32. void on_closeBtn_clicked();
    33. private:
    34. Ui::Widget *ui;
    35. //摄像头相关的成员设置
    36. //视频流对象
    37. VideoCapture video;
    38. //存放图像的容器对象
    39. Mat src;
    40. Mat gray;
    41. Mat rgb;//存放从bgr转化成rgb图的
    42. Mat dest;
    43. //级联对象
    44. CascadeClassifier c;
    45. //图像中人脸的容器集合
    46. vector faces;
    47. //定义一个打开摄像头的定时器
    48. int camer_time_id;
    49. void timerEvent(QTimerEvent *e);
    50. };
    51. #endif // WIDGET_H

    widget.cpp:

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent) :
    4. QWidget(parent),
    5. ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. ui->wechatBtn->setEnabled(false);
    9. //0代表打开摄像头
    10. if(!video.open(0)){
    11. QMessageBox::information(this,"提示","打开系统摄像头失败");
    12. return;
    13. }
    14. //级联分类器的配置
    15. if(!c.load("D:\\opencv\\heads\\haarcascade_frontalface_alt.xml")){
    16. QMessageBox::information(this,"提示","配置失败");
    17. return;
    18. }
    19. }
    20. Widget::~Widget()
    21. {
    22. delete ui;
    23. }
    24. //打开摄像头对应的槽函数处理
    25. void Widget::on_openBtn_clicked()
    26. {
    27. camer_time_id =startTimer(20);
    28. }
    29. //定时器处理函数
    30. void Widget::timerEvent(QTimerEvent *e)
    31. {
    32. //判断哪个定时器
    33. //1.打开摄像头的定时器超时
    34. if(e->timerId()==camer_time_id){
    35. video.read(src);
    36. //将bgr转化位rgb
    37. cvtColor(src,rgb,CV_BGR2RGB);
    38. //设置rgb的长宽
    39. cv::resize(rgb,rgb,Size(ui->label->width(),ui->label->height()));
    40. //转化为灰度
    41. cvtColor(rgb,gray,CV_RGB2GRAY);
    42. //转化为直方图
    43. equalizeHist(gray,dest);
    44. //获取人脸放入人脸集合容器
    45. c.detectMultiScale(dest,faces);
    46. //绘制矩形框
    47. for(int i=0;isize();i++){
    48. rectangle(rgb,faces[i],Scalar(255,0,0),4);
    49. }
    50. flip(rgb,rgb,1);//0表示x轴的反转,1y轴反转,-1表示xy轴翻转
    51. //定义一个QImage
    52. QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
    53. //放入label
    54. ui->label->setPixmap(QPixmap::fromImage(img));
    55. }
    56. }
    57. void Widget::on_closeBtn_clicked()
    58. {
    59. killTimer(camer_time_id);
    60. }

    widget.ui:

    运行结果:点击打开摄像头,出现画面,红框框人脸,点击关闭摄像头,定时器关闭,画面停止;

    实现大致思路:

    大概分为视频的调用和红框的实现:

    视频的调用:视频是由一帧一帧的像素帧(也就是图片)实现,到底也是对图片的操作

    首先实例化视频流对象video,打开摄像头系统video.open,通过定时器来实现画面获取(之前的demo是用while循环),获取图片video.read(src),(src为Mat对象,存储图片),根据需要对其进行处理(灰度图、直方图。。)

    红框的实现:

    ,定义一个级联分类器CascadeClassifier c(用来后面获取人脸位置),并加载其配置文件c.load("配置文件路径"),然后调用detectMutiScale,获取人脸位置,调用循环绘制矩形,将绘制矩形后的图片以合适的格式放到label标签上就可以

    一些函数解释:

    视频流相关类和函数: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轴翻转

    图像相关处理函数

    色彩空间转化函数

    函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ); //功能:将给定的图像进行色彩空间转化 //参数1:要转化的图像 //参数2:转化后的图像容器 //参数3:转化规则CV_BGR2GRAY 将彩色图转为灰度图

    均衡化处理

    函数原型:void equalizeHist( InputArray src, OutputArray dst ); //功能:将灰度图进行均衡化直方图拉伸 //参数1:要处理的图像,灰度图 //参数2:均衡化处理后的图像容器

    级联分类器(CascadeClassifier)

    下载级联分类器函数

    bool load( const String& filename ); 功能:将本地的分类器模型,加载到程序中 参数:级联分类器模型的路径 返回值:bool

    获取人脸矩形框

    函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector& objects) //功能:通过给定的图像,获取矩形框人脸所在区域的矩形框 //参数1:要识别的人脸图像 //参数2:识别后矩形框容器

    将矩形框绘制到图像上

    函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);*/ //功能:在给定的图像上,绘制给定的矩形框 //参数1:要被绘制的图像 //参数2:要绘制的矩形框 //参数3:矩形框颜色 //参数4:矩形框线条粗细

  • 相关阅读:
    阿里云主机遭受DDOS攻击IP不能使用如何更换弹性公网IP
    [SPOJ FASTFLOW] Fast Maximum Flow [最大流]
    Node.js的readline模块 命令行交互的模块
    Android setTheme设置透明主题无效
    黑马程序员ssm总结[大全版本,有对应pdf+源码](spring->springmvc-->springboot-->maven高级->cloud微服务)
    阿里云云原生一体化数仓 — 分析服务一体化新能力解读
    Linux项目后端部署及JDK&Tomcat&MySQL安装
    Linux Control Cgroups
    java毕业设计维保管理系统mybatis+源码+调试部署+系统+数据库+lw
    Pandas教程(非常详细)(第六部分)
  • 原文地址:https://blog.csdn.net/weixin_53762703/article/details/133996393