2014-09-10 4 views
0

Qlabel에 라이브 카메라 이미지를 표시하려고합니다. 코드를 시작하면 오류가 발생하지 않고 카메라 표시등이 파란색으로 바뀌어 작동한다는 의미입니다. 그러나 UI가 시작되지 않습니다. 내 코드를 디버그 한 후에 나는 while(true)에서 항상 루핑을 보지만, ui->lblProcessedVideo->setPixmap..... 명령은 어떤 ui도 표시하지 않는다.QLabel에서 캡처 이미지를 표시하는 방법

당신은 친절하게 내 실수를 보여 주 시겠어요 ..

다음

내 일부 코드입니다 :

void MainWindow::getImageFromVideo() 
{ 
    CvCapture* capture; 
    cv::Mat frame; 
    cv::Mat gray_frame; 

    capture = cvCaptureFromCAM(0); 

    if(capture) 
    { 
     while(true) 
     { 
      frame = cvQueryFrame(capture); 

      if(!frame.empty()) 
      { 
       cvtColor(frame, gray_frame, CV_BGR2GRAY); 

       equalizeHist(gray_frame, gray_frame); 

       ui->lblProcessedVideo->setPixmap(QPixmap::fromImage(Mat2QImage(frame))); 
      } 
     } 
    } 
} 

편집 : Mat2QImage()이 Ezee 당신이 말했듯이 QImage

+0

은 레이아웃 안의'lblProcessedVideo' 라벨입니까? 라벨 크기가 '0'이고 콘텐츠가 숨겨져있는 것 같습니다. 어쩌면'Mat2QImage'가 제대로 작동하는지 확인하기 위해 이미지를 파일에 저장할 수 있습니다. – eferion

+0

가장 좋은 제안은 아니지만 여전히 시도 할 수 있습니다 :'ui-> lblProcessedVideo-> setPixmap (...'. – vahancho

+0

)의 뒤에'QCoreApplication :: processEvents()'를 호출하면됩니다. @eferion yes'lblProcessVideo'가 작동합니다. 'setText()'속성들. 내가 코드를 디버깅 할 때'Mat2QImage'도 리턴 값이라는 것을 알았습니다 .. – goGud

답변

1

에 매트를 변환하는 기능입니다 카메라에서 이미지 캡처를 별도의 스레드로 위임해야하며, 그 다음 이미지를 GUI 스레드로 보냅니다. heres는 샘플 코드 :

//timer.h

class Timer : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit Timer(QObject *parent = 0); 
    void run(); 
signals: 
    void updFrame(QPixmap); 
public slots: 

}; 

//timer.cpp

Timer::Timer(QObject *parent) : 
    QThread(parent) 
{ 
} 

void Timer::run() { 
    VideoCapture cap(0); // open the default camera 
    for(;;){ 
     Mat frame; 
     cap.read(frame); 
     QPixmap pix = QPixmap::fromImage(IMUtils::Mat2QImage(frame)); 
     emit updFrame(pix); 
     if(waitKey (30) >= 0){ 
      break; 
     } 
    } 
} 

//videoviewer.h

class VideoViewer : public QLabel 
{ 
    Q_OBJECT 
public: 
    explicit VideoViewer(QObject *parent = 0); 

signals: 

public slots: 
    void updateImage(QPixmap pix); 
}; 

//videoviever.cpp

VideoViewer::VideoViewer(QObject *parent) : 
    QLabel() 
{ 
    Timer* timer = new Timer(); 
    connect(timer,SIGNAL(updFrame(QPixmap)),this,SLOT(updateImage(QPixmap))); 
    timer->start(); 
} 

void VideoViewer::updateImage(QPixmap pix){ 
    this->setPixmap(pix); 
} 
+0

GUI 스레드는 이미지가 라벨에 페인트되지 않습니다. 코드에. –

관련 문제