【问题标题】:QLabel is not displaying videoQLabel 不显示视频
【发布时间】:2017-10-12 16:46:47
【问题描述】:

这可能是一个非常愚蠢的问题,但我真的对此很了解。

在这里,我试图在QLabel 中逐帧显示视频。在用户界面中,有一个QPushButton,点击哪个用户可以选择视频。然后得到视频文件的QString,然后将其转换为cv::String,这样就可以使用OpenCV库加载视频了。加载后,cv::video 中的每个Mat3b 类型的帧都将转换为QImage,以便这些帧可以显示在QLabel 中。但是当我运行这个程序时,QLabel 没有显示视频。片刻之后,它会显示Project.exe is not responding。 这可能有点复杂,但这样做是为了如果需要,可以在每一帧上应用一些特定的 OpenCV 方法。这是一些代码,负责这个。

void MainWindow::on_Browse_clicked()
{
    QFileDialog dialog(this);
    dialog.setNameFilter(tr("Videos (*.avi)"));
    dialog.setViewMode(QFileDialog::Detail);
    QString videofileName = QFileDialog::getOpenFileName(this, tr("Open 
    File"), "C:/", tr("Videos (*.avi)"));

    if(!videofileName.isEmpty())
    {
        String videopath;        
        videopath = videofileName.toLocal8Bit().constData();

        bool playVideo = true;
        VideoCapture cap(videopath);
        if(!cap.isOpened())
        {
            QMessageBox::warning(this, tr("Warning"),tr("Error loadeing 
            video."));
            exit(0);
        } 
        Mat frame;

        while(1)
        {
            if(playVideo)
               cap >> frame;

            Mat3b src=frame;
            QImage dest= Mat3b2QImage(src); //To convert Mat3b to QImage

            ui->label->setPixmap(QPixmap::fromImage(dest));

            if(frame.empty())
            {
                QMessageBox::warning(this, tr("Warning"),tr("Video frame 
                cannot be openned."));
                break;
            }
        }
    }
}

但是当我在最后三个花括号前添加以下几行时,QLabelcv::window 都在显示视频。

             imshow("Video",src);
             char key = waitKey(10);
             if(key == 'p')
                playVideo = !playVideo;
             if(key == 'q')
                break; 

但我不想用cv::window 显示。任何人都可以帮我解决它吗?我很感激任何帮助。 提前致谢。

【问题讨论】:

  • 设置像素图后添加QApplication::processEvents();
  • 哇,谢谢,现在可以正常使用了。
  • 很高兴它有帮助。然后作为答案添加

标签: c++ qt opencv


【解决方案1】:

GUI 线程正忙于无限的while 循环,所以你永远不会给 Qt 更新 GUI 的机会。

您应该在循环内添加QApplication::processEvents,其中:

处理调用线程的所有待处理事件 [...]。

当您的程序忙于执行长时间操作时,您可以偶尔调用此函数

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多