注意,要在ui界面上放置一个“Vertical Layout”控件,调整到合适大小
- #include <QtWidgets/QMainWindow>
- #include <QPaintEvent>
- #include <QTimer>
- #include <QPainter>
- #include <QPixmap>
- #include <QLabel>
- #include <QImage>
- #include <opencv.hpp>
- #include "ui_mainwindow.h"
- using namespace cv;
- class mainwindow : public QMainWindow
- {
- Q_OBJECT
- public:
- mainwindow(QWidget *parent = 0);
- ~mainwindow();
- public slots:
- void updateImage();
- private:
- QTimer theTimer;
- Mat srcImage;
- VideoCapture videoCap;
- QLabel *imageLabel;
- Ui::mainwindowClass ui;
- protected:
- void paintEvent(QPaintEvent *e);
- };
#include <QtWidgets/QMainWindow>
#include <QPaintEvent>
#include <QTimer>
#include <QPainter>
#include <QPixmap>
#include <QLabel>
#include <QImage>
#include <opencv.hpp>
#include "ui_mainwindow.h"
using namespace cv;
class mainwindow : public QMainWindow
{
Q_OBJECT
public:
mainwindow(QWidget *parent = 0);
~mainwindow();
public slots:
void updateImage();
private:
QTimer theTimer;
Mat srcImage;
VideoCapture videoCap;
QLabel *imageLabel;
Ui::mainwindowClass ui;
protected:
void paintEvent(QPaintEvent *e);
};
- mainwindow::mainwindow(QWidget *parent)
- : QMainWindow(parent)
- {
- ui.setupUi(this);
- connect(&theTimer, &QTimer::timeout, this, &mainwindow::updateImage);
- //从摄像头捕获视频
- if(videoCap.open(0))
- {
- srcImage = Mat::zeros(videoCap.get(CV_CAP_PROP_FRAME_HEIGHT), videoCap.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
- theTimer.start(33);
- }
- //设置显示视频用的Label
- imageLabel = new QLabel(this);
- ui.verticalLayout->addWidget(imageLabel);
- }
- mainwindow::~mainwindow()
- {
- }
- void mainwindow::paintEvent(QPaintEvent *e)
- {
- //显示方法一
- QPainter painter(this);
- QImage image1 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
- painter.drawImage(QPoint(20,20), image1);
- //显示方法二
- QImage image2 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
- imageLabel->setPixmap(QPixmap::fromImage(image2));
- imageLabel->resize(image2.size());
- imageLabel->show();
- }
- void mainwindow::updateImage()
- {
- videoCap>>srcImage;
- if(srcImage.data)
- {
- cvtColor(srcImage, srcImage, CV_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR
- this->update(); //发送刷新消息
- }
- }
mainwindow::mainwindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(&theTimer, &QTimer::timeout, this, &mainwindow::updateImage);
//从摄像头捕获视频
if(videoCap.open(0))
{
srcImage = Mat::zeros(videoCap.get(CV_CAP_PROP_FRAME_HEIGHT), videoCap.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
theTimer.start(33);
}
//设置显示视频用的Label
imageLabel = new QLabel(this);
ui.verticalLayout->addWidget(imageLabel);
}
mainwindow::~mainwindow()
{
}
void mainwindow::paintEvent(QPaintEvent *e)
{
//显示方法一
QPainter painter(this);
QImage image1 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
painter.drawImage(QPoint(20,20), image1);
//显示方法二
QImage image2 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
imageLabel->setPixmap(QPixmap::fromImage(image2));
imageLabel->resize(image2.size());
imageLabel->show();
}
void mainwindow::updateImage()
{
videoCap>>srcImage;
if(srcImage.data)
{
cvtColor(srcImage, srcImage, CV_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR
this->update(); //发送刷新消息
}
}
演示结果