Mostrando un’immagine utilizzando la libreria OpenCV 2.2 su Linux Ubuntu con la piattaforma Qt

Ehi ragazzi,
Sto usando Qt come il mio C++ IDE piattaforma su Ubuntu 10.10 con OpenCV 2.2.
Mi limiterò a scrivere pezzi di codice e vedi dov’è il problema:

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main(int argc, char *argv[])
{       
    VideoCapture cap = VideoCapture(0);
    Mat frame;
    do
    {
        cap >> frame;
        imshow("frame",frame);
    } while (waitKey(10) != 27);
    return 0;
}

Ho 3 avviso di stampe che sembra qualcosa di simile a questo:

VIDIOC_QUERYMENU: Invalid argument

E tutto sembra andare bene (la macchina fotografica).

Ho dovuto aggiungere utilizzo di Qt e ha aggiunto 3 righe di codice, e sembra che questo:

#include <QApplication>
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);       
    VideoCapture cap = VideoCapture(0);
    Mat frame;
    do
    {
        cap >> frame;
        imshow("frame",frame);
    } while (waitKey(10) != 27);

    return app.exec();
}

Ho ancora i 3 messaggi di avviso, ma ora, la “cornice” della finestra è di colore grigio, e non appare nulla.

Questa è la mia prima volta con Qt, quindi non so bene come funziona. Posso solo immaginare che QApplication è ottenere il controllo sopra la finestra di gestione, che provoca la imshow comando di non essere in grado di aprire una nuova finestra.

Gradirei il vostro aiuto,
THNX!

OriginaleL’autore Royi Freifeld | 2011-03-02

4 Replies
  1. 1

    Il tuo problema è con Qt movimentazione proprio ciclo di eventi e, quindi, il ciclo di eventi di OpenCV è morto di fame e che non hanno mai eseguito.

    Il modo per farli lavorare insieme, è abbastanza semplice: Visualizzare la vostra libreria OpenCV come QPixmap (da convertire l’immagine in QImage quindi utilizzare QLabel per visualizzarla). Quindi aggiungere questo QLabel al tuo QWidget. Il QWidget possono essere incorporati o diventare il widget principale del tuo QApplication.

    Ad usare il buffer del curriculum vitae::Mat immagine come QImage, vedere questa risposta come convertire un opencv cv::Tappetino per qimage

    Per visualizzare questo QImage, vedere
    Display QImage con QtGui

    OriginaleL’autore Dat Chu

  2. 2

    La tua ipotesi non è corretta. OpenCV avrà la sua connessione al server X e non essere colpiti da Qt finestra di gestione (tuttavia, waitKey() la gestione di input e app.exec() non banalmente lavorare in parallelo).

    Ho provato anche il codice simile per individuare eventuali imprevisti effetti collaterali. Tutte le finestre sono disegno bene sulla mia macchina Debian con OpenCV 2.2 e Qt 4.6.2.

    Un banale test su un lato, potrebbe essere quella di creare l’app in oggetto subito dopo il ciclo while. Tuttavia, può essere solo casuale cambiamento nel vostro layout di stack che ha causato la vostra avvisi di diventare un problema grave? Si dovrebbe anche controllare con valgrind.

    OriginaleL’autore ypnos

  3. 1

    Che non si può mischiare openCV controllo del ciclo di eventi e di qt app.exec

    Utilizzare le Qt sapore del cvNamedWindow, o semplice cattura immagini da openCV e li visualizza in un QLabel. O meglio ereditare da QWidget e scrivere il proprio QImage pittore

    void OpencvWidget::paintEvent(QPaintEvent*)
    {
        //m_win is the window size
        QPainter p(this);                           
        p.drawImage(m_win,m_image,m_image.rect());
    
    }

    OriginaleL’autore Martin Beckett

  4. 1

    Ho affrontato un problema simile di recente (visualizzazione webcam informazioni utilizzo di OpenCV e Qt come finale GUI). Il modo migliore che ho trovato a giocare il video (che è fondamentalmente un insieme di immagini è quello di utilizzare un GLWidget. In questo GLWidget è possibile creare un rettangolo e allegare una texture di essa, dove la trama è l’immagine che si desidera visualizzare. Un altro problema è che il formato dell’immagine è diverso per OpenCV e OpenGL, ma si può facilmente cambiare il formato, cambiando l’ordine dei canali.

    Nel codice, è la creazione di un QApplication che ha il suo iddle processo, quindi non si può mai raggiungere il tuo ciclo while. Anche voi non si è creata alcuna Qt finestra di visualizzazione, vi consiglio di controllare gli esempi forniti con Qt per controllare la struttura di base l’applicazione e iniziare con un QMainWindow o un QDialog.

    I passaggi sono:

    1. Creare la Finestra principale (QDialog è quello che ho usato).
    2. Creare un GLWidget e aggiungere il layout della finestra di Dialogo/MainWindow.
    3. Ricevere l’immagine da OpenCV e trasformarlo in un formato che OpenGL è visualizzato correttamente.
    4. Usando OpenGL, creare un rettangolo e allegare l’immagine come texture.
    IMHO, l’utilizzo di OpenGL è inutilmente complesso per un semplice imshow operazione.
    Dipende da cosa si considera necessario, naturalmente. Il codice che ha scritto è la ricezione di una nuova immagine ogni iterazione del ciclo while. Nella mia esperienza, solo con l’uso di OpenGL sono stato in grado di evitare lo sfarfallio in un video (che è quello che ho sempre supposto che sta cercando di display).

    OriginaleL’autore sergi

Lascia un commento