2017-10-12 1 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; 
      } 
     } 
    } 
} 

그러나 QLabelcv::window 비디오를 표시하는 두 나는 지난 3 중괄호 브래킷하기 전에 다음 몇 줄을 추가 할 때.

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

그러나 cv::window으로 표시하고 싶지 않습니다. 아무도 내가 고칠 수 있도록 도와 줄 수 있습니까? 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

+0

의 (a '의 QApplication :: processEvents 추가)을 수행 중입니다 때 가끔이 함수를 호출 할 수는, 당신은 픽스맵을 설정 한 후' – Miki

+0

와우, 감사합니다, 지금은 잘 작동 . – Gansroy

+0

도움이 되니 기쁩니다. 그 때 대답으로 추가됨 – Miki

답변

1

GUI 스레드가 무한 while 루프에서 사용 중이므로 Qt에게 GUI를 업데이트 할 기회를주지 마십시오.

당신은 루프, 내부 QApplication::processEvents를 추가해야하는 :

프로세스 호출 스레드에 대한 모든 보류중인 이벤트 [...].

프로그램이 긴 작업

관련 문제