参考:http://blog.csdn.net/augusdi/article/details/8865541
代码如下:
注意,要在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); };
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(); //发送刷新消息 } }
演示结果: