注:接上篇《Qt5.9.7 OpenCV 人脸识别》之开发环境搭建(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
示例头文件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() { }
效果图: