首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QLabel中显示视频

在QLabel中显示视频
EN

Stack Overflow用户
提问于 2020-01-15 18:58:47
回答 1查看 606关注 0票数 0

我正尝试在QT Creator中显示QLabet格式的视频。我正在用openCV看视频。下面是我的代码:

mainwindow.cpp

代码语言:javascript
复制
#include "includes.h"
#include "vidreadthread.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    VidReadThread *thread1 = new VidReadThread("Video read thread");
    thread1->start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

vidreadthread.cpp

代码语言:javascript
复制
#include "vidreadthread.h"
#include "includes.h"

using namespace cv;
extern MainWindow *mainPtr;

VidReadThread::VidReadThread(QString s) : name(s)
{
}

void VidReadThread::run()
{
    QThread::msleep(100);
    VideoCapture cap;
    cap.open("helicopter_with_stickers.mp4");
    while(1)
    {
        Mat image1;
       // Capture frame-by-frame
        cap >> image1;

       // If the frame is empty, break immediately
       if (image1.empty())
         break;

       QImage image2 = QImage((uchar*) image1.data, image1.cols, image1.rows, image1.step, QImage::Format_RGB888);
       mainPtr->ui->label1->setPixmap(QPixmap::fromImage(image2));
    }
}

我可以显示视频,但我不能设置帧率。整个60秒的视频在4-5帧内完成。我只用OpenCV对cvWaitkey()的帧率有命令,但在这里msleep()似乎不适用于类似的应用程序。请建议一种不跳帧的方法。我做了一个vidreadthread,这样图形用户界面就不会在读取视频时挂起。

如果有任何其他方法可以让我在QT UI中显示OpenCV窗口,那么也请推荐。

EN

回答 1

Stack Overflow用户

发布于 2021-11-10 01:14:02

尝试移动到线程可能工作得更好

.cpp

代码语言:javascript
复制
for (int i = 0; i<Camera::getCameraCount();)
        ui->comboBox->addItem(QString::number(i++)); //name camera
    camera = new Camera();
    camera->moveToThread(&thread); 

connect(this, SIGNAL(cameraOperate(int)), camera, SLOT(Operate(int))); 
connect(camera, SIGNAL(updateImage(QImage)), this, SLOT(updateImage(QImage))); 


void app0::updateImage(QImage image)
{
    ui->videoviewer->setPixmap(QPixmap::fromImage(image));
}

相机线程:

代码语言:javascript
复制
void Camera::Operate(int _index)
{
    if (open(_index)) { qDebug() << "Camera open success!";}
    else { qDebug() << "Camera open failed!"; return; }
    if (capture.get(28) == -1) { cout << "get 28 -1" << "\n";emit }
    while (1)
    {
        qApp->processEvents();
        Mat matin = read(); //read mat
        matnow = matin;
        QImage image = Mat2QImage(matin);
        emit updateImage(image);
    }
}

链接:https://blog.csdn.net/Sun_tian/article/details/104236327

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59749989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档