2017-10-12 5 views
0

これは非常にばかげた問題かもしれませんが、私は本当にこの上にスタックしています。QLabelはビデオを表示していません

ここでは、QLabelにフレーム単位でビデオフレームを表示しようとしています。ユーザーインターフェイスでは、ビデオを選択できるユーザーをクリックするとQPushButtonが表示されます。その後、ビデオファイルのQStringを取得し、cv::Stringに変換して、OpenCVライブラリを使用してビデオを読み込むことができます。ロード後、cv::videoMat3bタイプのフレームはすべて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; 
      } 
     } 
    } 
} 

しかし、私は最後の3つの中括弧ブラケットの前に次の数行を追加したとき、QLabelcv::windowの両方がビデオを表示しています。

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

しかし、私はcv::windowと表示したくありません。誰でも私がそれを修正するのを助けることができる?私はどんな助けにも感謝します。 ありがとうございます。

+0

を実行するビジー状態のときは、時折、この関数を呼び出すことができ;'あなたが – Miki

+0

うわー、ありがとうピックスマップを設定した後、それが今で正常に動作します。 – Gansroy

+0

喜んで助けました。その後、回答として追加されました – Miki

答えて

1

GUIスレッドは無限のwhileループでビジー状態です。したがって、GUIを更新するチャンスをQtに与えることは決してありません。

あなたは、ループ内でどのQApplication::processEventsを追加する必要があります

プロセス呼び出し元のスレッドのために保留中のすべてのイベントを[...]。

あなたのプログラムが `はQApplication ::のprocessEvents()を追加し、長い操作を

関連する問題