OpenCV在Qt中显示视频的两种方法

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 09:07   79   0

参考: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(); //发送刷新消息
 }
}

演示结果



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP