2016-05-26 13 views
3

, so kann ich meinen Webcam-Stream mit OpenCV mit imshow mit diesem einfachen CodeShow Webcam-Stream von OpenCV mit Qt

int main(int, char**) 
{ 
    VideoCapture cap(0); 
    Mat edges; 
    namedWindow("webcam", 1); 
    while (true) 
    { 
     Mat frame; 
     cap >> frame; 
     imshow("webcam", frame); 
     if (waitKey(30) >= 0) break; 
    } 
    return 0; 
} 

jetzt sehen, was ich möchte, ist das Bild von OpenCV in QImage in Widget auf QT zu zeigen, Hier ist eine Umwandlung von cv :: Mat zu QImage

QImage Mat2QImage(cv::Mat const& src) 
{ 
    cv::Mat temp; 
    cvtColor(src, temp, CV_BGR2RGB); 
    QImage dest((const uchar *)temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888); 
    dest.bits(); 
    // of QImage::QImage (const uchar * data, int width, int height, Format format) 
    return dest; 
} 

und dem kleinen Code ein Bild mit QImage in QT zu zeigen

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QImage myImage; 
    myImage.load("a.png"); 
    QLabel myLabel; 
    myLabel.setPixmap(QPixmap::fromImage(myImage)); 
    myLabel.show(); 
    return a.exec(); 
} 

Ich habe versucht, sie auf diese Weise zu kombinieren, aber kein Glück

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    VideoCapture cap(0); 

    QImage myImage; 
    QLabel myLabel; 
    while (true) 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera 

     myImage = Mat2QImage(frame); 
     myLabel.setPixmap(QPixmap::fromImage(myImage)); 
    } 


    myLabel.show(); 

    return a.exec(); 
+1

Dies ist nicht, wie Es klappt. Du gehst in eine Endlosschleife: Wie kannst du irgendetwas sehen, da die 'myLabel.show()' * nach * der Schleife ist? – Boiethios

+1

Das Streaming von einem Gerät sollte zusammen mit einer Verarbeitung der Bilddaten in einem separaten Thread erfolgen. Wenn Sie früher oder später tun, was Sie tun, müssen Sie Ihren Code neu schreiben. Überprüfen Sie ein paar Videos, die ich gemacht habe auf Integration von OpenCV mit Qt: https://www.youtube.com/watch?v=vKIEzqmeajQ&index=1&list=PLxpCFVM0F4wWJm8LB-_-_U-ag6knR8Kmc&ab_channel=rbaleksandar Beachten Sie, dass Sie auch verwenden können, benutzerdefiniertes 'QThread' und du musst dich nicht an das Worker-Muster halten, das ich im Tutorial verwendet habe. – rbaleksandar

Antwort

2

Sie haben eine Window zu erstellen, die von QMainWindow mit einem QTimer erbt. Verbinden Sie den Timer im Konstruktor mit einer Window Methode. Sie werden Ihren OpenCV-Code in dieser Timeout-Methode setzen, dass jeder X-Millisekunden aufgerufen wird:

class Window : public QMainWindow 
{ 
    Q_OBJECT 
    QTimer _timer; 

    private slots: 
    void on_timeout() 
    { 
     // put your opencv code in it 
    } 
    public: 
    Window() : 
     QMainWindow(), _timer(this) 
    { 
     connect(&_timer, SIGNAL(timeout()), this, SLOT(on_timeout())); 
     // populate your window with images, labels, etc. here 
     _timer.start(10 /*call the timer every 10 ms*/); 
    } 
}; 

Dann wird Ihr Fenster im Haupt zeigen:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Window win; 
    win.show(); 
    return a.exec(); 
} 

Wenn Sie Qt Creator verwenden, ist es einfacher mit Qt zu entwickeln: darüber nachdenken.

0

danke @Boiethios für Ihre Antwort dies der letzte Code ist ich es

in mainwindow.cpp setzen
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 
class Window : public QMainWindow 
{ 
    Q_OBJECT 
     QTimer _timer; 

    private slots: 
    void on_timeout() 
    { 
     VideoCapture cap(0); 

     Mat edges; 
     namedWindow("edges", 1); 
     while (true) 
     { 
      Mat frame; 
      cap >> frame; 
      myImage = Mat2QImage(frame); 
      myLabel.setPixmap(QPixmap::fromImage(myImage)); 
      myLabel.show(); 
     } 
    } 
public: 
    QImage myImage; 
    QLabel myLabel; 
    Window() : 
     QMainWindow(), _timer(this) 
    { 
     connect(&_timer, SIGNAL(timeout()), this, SLOT(on_timeout())); 
     // populate your window with images, labels, etc. here 
     _timer.start(10 /*call the timer every 10 ms*/); 
    } 
}; 

es kompilieren und ausführen in Ordnung, aber nichts passiert nur ein leeres Fenster

+0

* Befüllen Sie Ihr Fenster mit Bildern, Beschriftungen usw. * bedeutet: Legen Sie Ihr Bild in das Fenster. Du wirst es nicht anders sehen. Tun Sie es mit dem Designer und greifen Sie darauf mit 'ui-> the_image_name' zu. – Boiethios

+2

Nur eine Randnotiz: Bitte posten Sie keine Antwort, die Sie sicher wissen, dass es nicht funktioniert. Wenn Sie Code anzeigen möchten, bearbeiten Sie Ihre Frage und fügen Sie den Code dort hinzu. Ansonsten 1) die Frage fehlt die wesentlichen Informationen, die Sie mit Ihrem neu hinzugefügten Code und 2) Menschen werden die Frage und dann schauen Sie sich die Antwort an ihren Kopf kratzen fragen, warum Sie etwas gepostet haben, wissen Sie, dass es nicht funktioniert . – rbaleksandar