《Qt5.9.7 OpenCV 人脸识别》之OpenCV显示摄像头图像

注:接上篇《Qt5.9.7 OpenCV 人脸识别》之开发环境搭建(OpenCV库编译) 

1 将编译完成的OpenCV库加入到工程

打开Qt Creator,新建Qt Widgets Application项目facedetection。

工程目录下新建文件夹opencv,并将OpenCV库构建目录build\install\目录下的include目录和x86拷贝到opencv目录下。将opencv\x86\mingw\bin下的动态库拷贝到程序构建目录,和可执行程序放一起。

facedetection.pro中加入opencv头文件路径

INCLUDEPATH += $$PWD/opencv/include \
               $$PWD/opencv/include/opencv

加入opencv静态库

LIBS += $$PWD/opencv/x86/mingw/lib/libopencv_calib3d345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_core345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_dnn345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_features2d345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_flann345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_highgui345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_imgcodecs345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_imgproc345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_ml345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_objdetect345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_photo345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_shape345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_stitching345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_superres345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_video345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_videoio345.dll.a \
        $$PWD/opencv/x86/mingw/lib/libopencv_videostab345.dll.a

2 OpenCV打开摄像头并显示到lable

示例头文件mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "opencv2/opencv.hpp"

using namespace cv;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void openCamara();      // 打开摄像头
    void closeCamer();      // 关闭摄像头
    void capture();         // 抓图

    void updateShow();

private:
    Ui::MainWindow *ui;

    QTimer          *m_timer;
    VideoCapture    m_capture;
    QImage          image;
    Mat             frame;
};

#endif // MAINWINDOW_H

示例源文件mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

QImage  mat2QImage(cv::Mat cvImg)
{
    QImage qImg;
    if (cvImg.channels() == 3)                             //3 channels color image
    {

        cv::cvtColor(cvImg, cvImg, CV_BGR2RGB);
        qImg = QImage((const unsigned char*)(cvImg.data),
            cvImg.cols, cvImg.rows,
            cvImg.cols*cvImg.channels(),
            QImage::Format_RGB888);
    }
    else if (cvImg.channels() == 1)                    //grayscale image
    {
        qImg = QImage((const unsigned char*)(cvImg.data),
            cvImg.cols, cvImg.rows,
            cvImg.cols*cvImg.channels(),
            QImage::Format_Indexed8);
    }
    else
    {
        qImg = QImage((const unsigned char*)(cvImg.data),
            cvImg.cols, cvImg.rows,
            cvImg.cols*cvImg.channels(),
            QImage::Format_RGB888);
    }

    return qImg;

}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_timer(new QTimer),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(m_timer,&QTimer::timeout,this,&MainWindow::updateShow);
    connect(ui->pushButton_openCamer,&QPushButton::clicked,this,&MainWindow::openCamara);
    connect(ui->pushButton_closeCamer,&QPushButton::clicked,this,&MainWindow::closeCamer);
    connect(ui->pushButton_capture,&QPushButton::clicked,this,&MainWindow::capture);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::updateShow()
{
    m_capture >> frame;
    image = mat2QImage(frame);

    ui->label_video->setPixmap(QPixmap::fromImage(image));

    m_timer->start(50);
}

void MainWindow::openCamara()
{
    m_capture.open(0);

    m_timer->start(50);

}

void MainWindow::closeCamer()
{
    m_timer->stop();

    m_capture.release();
}

void MainWindow::capture()
{

}

效果图:

 

源码下载:https://gitee.com/wangzhenglin/facedetection