《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()
{
}
效果图: