2017-10-12 258 views
0

这可能是一个非常愚蠢的问题,但我真的得到了这个堆栈。QLabel不显示视频

这里,我试图在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显示。任何人都可以帮我修复它吗?我感谢任何帮助。 在此先感谢。

+0

添加一个'的QApplication :: processEvents();'你设置的像素图后 – Miki

+0

哇,谢谢你,现在工作正常。 – Gansroy

+0

很高兴帮助。然后添加为答案 – Miki

回答

1

GUI线程在无限的while循环中忙碌,因此您绝不会给Qt更新GUI的机会。

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

进程调用线程的所有等待事件[...]。

你偶尔可以调用此功能时,你的程序正忙于执行长时间操作