2012-04-24 3 views
2

OpenCV 라이브러리의 방법으로 프레임을 재생하여 비디오를 처리하려고하는데 여기에 opencv/highgui의 imshow 메서드를 사용하여이 프레임을 표시하면 문제가 없습니다.Qt gui 응용 프로그램을 통해 비디오 프레임을 표시하는 방법은 무엇입니까?

그러나 Qt-gui 앱을 사용하여 실시간으로 표시 할 때는 관리 할 수 ​​없습니다.

프로그램은 openfile 대화 상자에서 비디오의 경로를 가져오고 while 루프 내에서 비디오 프레임을 grap하고 처리합니다. 처리 단계 후에 QLabel에 이러한 처리 된 프레임을 표시하려고하면 gui-app의 QLabel에 비디오의 길이에 따라 아무 것도 표시되지 않고 비디오 마지막 부분의 마지막 프레임 만 표시됩니다. 각 프레임의 레이블을 새로 고치거나 업데이트하려고했지만 작동하지 않았습니다.

내가 할 일이 없습니까? 아니면 더 편리한 방법이 있습니까?

내 코드에 필요한 부분은 다음과 같습니다. 미리 감사드립니다.

bool stop=false; 
cv::VideoCapture capture("a.avi"); 
cv::Mat cur_frame; 

while (!stop) {  
      //...    
      capture.read(cur_frame);     
      //process steps..    
      QImage img= QImage((const unsigned char*)(cur_frame.data), 
           cur_frame.cols,cur_frame.rows, 
           QImage::Format_RGB888); 
      ui->label->setPixmap(QPixmap::fromImage(img)); 
      // resize the label to fit the image 
      ui->label->resize(ui->label->pixmap()->size()); 
      //... 
      cv::waitkey(50); 
      } 

답변

1

Qt는 컨트롤이 이벤트 루프로 돌아 왔을 때만 UI를 업데이트 할 수 있습니다. 루프에서 qApp->processEvents()을 호출 해 볼 수는 있지만 최적의 방법은 아닙니다.

+1

고마워요 아놀드, 적어도 지금은 유용합니다. 그 외에,이 작업을 수행하기위한 최적의 접근 방법은 무엇일까요? 프레임을 Qlabel을 사용하여이 작업을 처리하는 데 사용할 수있는 적합한 방법을 표시합니까? (QT를 잘 모르기 때문에 Qlabel을 사용했습니다.) – Horizon1710

+1

불행히도 나는 최선의 방법으로 당신에게 좋은 대답을하지 못했습니다. 그것을하기 위해. Qt로 실시간 비디오처럼 까다로운 작업을 수행하지 않았습니다. –

+1

비록 이것이 오래된 질문이지만이 대답 (http://stackoverflow.com/a/2671834/1990758)이 도움이 될 수 있음을 지적하고자합니다. – Energy

관련 문제