2012-01-14 12 views
8

Voglio creare una GUI con 2 rettangoli per la visualizzazione di video (uno in cui si vede il video di input, uno in cui si vede il video post-elaborato).Come spingere una finestra di visualizzazione di immagini OpenCV in una GUI QT con Visual Studio?

Voglio che sia integrato in una GUI QT-made, ma voglio che queste aree video vengano popolate da OpenCV, in alternativa al metodo cv::nameWindow di OpenCV.

Come posso fare questo?

+1

Non so, come integrare le finestre di 'opencv' in Qt, ma se si ottiene' IplImage' su qualsiasi livello, può essere facilmente convertito in 'QImage' e' QPixMap', che possono essere visualizzati su 'QLabel' – Lol4t0

+0

Come Lol4t0, non so come integrare un video di OpenCV all'interno di alcuni QWidget. Ma posso rispondere a come farlo facilmente manualmente. È davvero semplice. – borges

+0

@borges Quindi per favore rispondi :) – zebra

risposta

8

Il flusso di lavoro di base per fare ciò che si desidera è:

  1. Aprire il video con OpenCV API (cvCreateFileCapture, per esempio)
  2. Grab IplImage fotogrammi dal video (cvQueryFrame)
  3. convertirli in QImage (vedi allegato soffietto codice)
  4. Mostra QImage su di un QLabel (QLabel :: setPixmap e QPixmap :: fromImage)
  5. loop l'aggiornamento telaio (utilizzando un QTimer, per esempio, con framerate video)

codice per convertire IplImage a QImage (supponendo RGB32Bits immagini):

QImage *IplImageToQImage(IplImage *input) 
{ 
    if (!input) 
     return 0; 

    QImage image(input->width, input->height, QImage::Format_RGB32); 

    uchar* pBits = image.bits(); 
    int nBytesPerLine = image.bytesPerLine(); 

    for (int n = 0; n < input->height; n++) 
    { 
     for (int m = 0; m < input->width; m++) 
     { 
      CvScalar s = cvGet2D(input, n, m); 
      QRgb value = qRgb((uchar)s.val[2], (uchar)s.val[1], (uchar)s.val[0]); 

      uchar* scanLine = pBits + n * nBytesPerLine; 
      ((uint*)scanLine)[m] = value; 
     } 
    } 

    return image; 
} 

La comprensione del codice di cui sopra dovrebbe essere semplice. Qualsiasi dubbio, faccelo sapere.

Questa opzione "livello basso" consente di manipolare ogni singolo fotogramma prima di visualizzarlo. Se si desidera visualizzare un video tramite Qt, è possibile utilizzare Phonon framework.

+2

Buona risposta! Ma, chiede C++, usi l'API C di OpenCV. Inoltre penso che cvGet2D non sia davvero efficiente se vuoi superare tutti i pixel dell'immagine! – ypnos

+1

Se si utilizza RGB888 per Qimage, è possibile utilizzare direttamente l'immagine di input. In alternativa, usa cvtColor() per convertire in BGRA per ottenere prestazioni qimage migliori –

+0

Il problema è che è molto più lento dell'utilizzo di cvShowImage (nella sua finestra) – vsz

8

Ecco un codice che converte un cv :: Mat in un QImage. I metodi sono per il virgola mobile a 24 bit RGB o in scala di grigi, rispettivamente.

QImage Mat2QImage(const cv::Mat3b &src) { 
     QImage dest(src.cols, src.rows, QImage::Format_ARGB32); 
     for (int y = 0; y < src.rows; ++y) { 
       const cv::Vec3b *srcrow = src[y]; 
       QRgb *destrow = (QRgb*)dest.scanLine(y); 
       for (int x = 0; x < src.cols; ++x) { 
         destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255); 
       } 
     } 
     return dest; 
} 


QImage Mat2QImage(const cv::Mat_<double> &src) 
{ 
     double scale = 255.0; 
     QImage dest(src.cols, src.rows, QImage::Format_ARGB32); 
     for (int y = 0; y < src.rows; ++y) { 
       const double *srcrow = src[y]; 
       QRgb *destrow = (QRgb*)dest.scanLine(y); 
       for (int x = 0; x < src.cols; ++x) { 
         unsigned int color = srcrow[x] * scale; 
         destrow[x] = qRgba(color, color, color, 255); 
       } 
     } 
     return dest; 
} 

Quindi, è possibile utilizzare QImage all'interno di un widget Qt. Vedi la risposta di borges.

+1

C'è qualche comunità che lavora di più sull'integrazione di Qt e OpenCV ?? o è proprio così (intendo il tuo codice) ?! Sono anche nuovo e il mio attuale interesse è questo. Grazie! –

+0

Bene, al giorno d'oggi il modulo highgui è opzionale con supporto Qt (imshow vi presenterà una bella finestra Qt, con pulsanti per zoom/pan, salvataggio su file, ecc.). Proviene da un progetto Google Summer of Code. Quindi OpenCV stesso ha ora funzionalità che li integra, nel modulo highgui. Per quanto ne so, non è esposto attraverso l'API. Non so se hanno piani per farlo. Tuttavia, avrebbe molto senso. – ypnos

Problemi correlati