OpenCV在Qt中顯示視訊的兩種方法
阿新 • • 發佈:2019-01-27
參考: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(); //傳送重新整理訊息 } }
演示結果