用QT做点事(二):做一个人脸检测界面

    这个其实很简单,可以参考博客:https://blog.csdn.net/shirley3052004/article/details/70162211,界面由两个label和两个pushBotton构成,具体流程如下:

    1、新建一个项目:

    文件 -> 新建文件或项目 -> Qt Widgets Application -> 输入名称:"face_detect"  -> 直接点击下一步到最后。

    2、打开界面文件对应mainwindow.ui,并拖四个控件

    双击mainwindow.ui -> 拖两个label和两个Push Button,并调整label大小 -> 修改Push Botton 的objectName 和 text(左边这个Push Botton按钮对应于打开摄像头功能,右边这个Push Botton 按钮对应于关闭摄像头功能,所有将左边的Push Botton的objectName 设置为openCam, text设置为openCamera, 右边Push Button的objectName 设置为closeCam, text设置为closeCamera)


    3、添加相应的信号处理函数

    分别右键单击左右两个Push Botton 按钮,转到槽 -> 然后修改mainwindow.h文件,修改部分如下:

    (1)添加头文件:

#include <QImage>
#include <QTimer>     // 设置采集数据的间隔时间
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
 
 
using namespace cv;
using namespace std;

    (2)在private slots中添加成员函数:

void readFrame();       // 读取当前帧信息

    (3)在private中添加成员:

QTimer    *timer;
QImage    *image;
VideoCapture cap;
Mat frame;
CascadeClassifier face_cascade;

     4、修改mainwindow.cpp文件

    (1) 修改mainwindow函数,添加如下部分:

    if( !face_cascade.load("F:\\QT\\data\\haarcascade_frontalface_alt2.xml") )
        cout << "--(!)Error loading face cascade\n";   
 
 
    timer = new QTimer(this);
    image = new QImage();
 
 
    // 时间到,读取当前摄像头信息
    connect(timer, SIGNAL(timeout()),
            this, SLOT(readFrame()));

        注意:cascade文件载入路径一定要跟自己cascade文件所在实际路径一致。

    (2) 在on_openCam_clicked()函数中添加:

    cap.open(0);
    timer->start(33);

    (3) 在on_closeCam_clicked()函数中添加:

    timer->stop();
    cap.release();

    (4) 添加readFrame() 函数的处理部分:

void MainWindow::readFrame()
{
    cap >> frame;
    Mat gray, frame1, frame2;
    vector<Rect> faces;
    cvtColor(frame, gray, COLOR_BGR2GRAY);
    cvtColor(frame, frame1, COLOR_BGR2RGB);
    QImage img((const uchar*)frame1.data,
               frame1.cols, frame1.rows,
               frame1.cols * frame1.channels(),
               QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));
 
 
    equalizeHist(gray, gray);
    //-- Detect faces
    face_cascade.detectMultiScale( gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(60, 60) );
    for ( size_t i = 0; i < faces.size(); i++ )
    {
        Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
        ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
 
 
    }
    cvtColor(frame, frame2, COLOR_BGR2RGB);
    QImage img1((const uchar*)frame2.data,
               frame2.cols, frame2.rows,
               frame2.cols * frame2.channels(),
               QImage::Format_RGB888);
    ui->label_2->setPixmap(QPixmap::fromImage(img1));
 
 
 
 
}
    这样就ok啦,运行一下,效果如下:


猜你喜欢

转载自blog.csdn.net/sinat_31425585/article/details/80728073
今日推荐