注意,要在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(); //发送刷新消息 } }
演示结果