Seite 1 von 1

Signal Slot Qpixmap von mainwindow zu dialog (auch OPENCV)

Verfasst: 4. März 2016 16:40
von dbspl
ich versuche es nochmal anders....

Hi,
ich habe ein Programm geschrieben in dem der Videostream einer IP Cam ausgewertet wird.
Dort Funktioniert alles wie es soll. In dem Programm wird durch Timer aller 25ms ein Frame von der IPCam genommen und in ein Label des ui geschrieben.
Dann werden in dem Timer noch andere Sachen wie Objektdetektierung und region of interrest abfragen erledigt usw....

Nun gibt es dort eine art maskierung, die ich bis jetzt über OPENCV

Code: Alles auswählen

imshow("Fenster",bildmatrix) 
anzeigen lasse.
In diesem Fenster erzeuge ich Trackbars mittels OPENCV

Code: Alles auswählen

createTrackbar( "Fadername", "Fenster", &Werte,maximalwert);
um damit die Punkte eines Polygons zu beeinflussen, die die Maskierung vornehemen.

Dieses Konfigurationsfenster erscheint nur auf Tasten druck.

nun möchtew ich das OpencvFenster weglassen und durch einen Dialog von QT ersetzen, da ich dort die Fader besser anordnen kann und noch ein paar andere Sachen in dem Dialog mit erledigen möchte.
Der Dialog existiert bereits. ein Label ist drin und die Fader auch.
mein Problem ist nun, die Bilddaten von meinem Hauptprogramm in das Label des Dialoges zu bekommen.

Nun nutze ich zwar QT, bin aber in sachen Signals und Slots noch nicht so bewandert, hab mich bius jetzt mehr um C++ und Opencv gekümmert...

Wenn mir jemand helfen könnte wie ichs anstellen muss wäre ich sehr dankbar.

hier auszüge aus meinem code (der ganze wird zu lang und unübersichtlich)
hauptprogramm:
ebl_fk.h

Code: Alles auswählen

#ifndef EBL_FK_H
#define EBL_FK_H
/**********************************************************************/
//Includes QT
#include <QMainWindow>
#include <QWindow>
#include <QSlider>
#include <QtMultimedia/QSound>
#include <QtCore>
#include <QMessageBox>
#include <QVariant>
#include <QSettings>
#include <QDebug>
#include <QDialog>
#include <QApplication>
#include <QTextEdit>
#include <QKeyEvent>
#include <QMainWindow>
#include <QDesktopWidget>
#include <QWidget>
#include <QRect>
#include <QSize>
/* .....
*/
namespace Ui {class EBL_FK;}
using namespace std;
using namespace cv;
/* .....
*/

//erstellen class EBL_FK
class EBL_FK : public QMainWindow
{
    Q_OBJECT

public slots:

    //deklaration Funktion bildverarbeitungUndUpdateLabels
    void bildverarbeitungUndUpdateLabels();
    void bildgroesse();
    void einstellungAufruf();


public:


        myconfig* mconfig;
/* .....
*/

private:
    Ui::EBL_FK *ui;

     //test qimage für dialog
     QImage test_mat;

/* .....
*/

in der ebl_fk.cpp sind dann folgende sachen .... (neben vielen anderen)

Code: Alles auswählen


#include "ebl_fk.h"
#include "ui_ebl_fk.h"
#include "myconfig.h"
#include "qdebug.h"

/*...*/

//construktor
EBL_FK::EBL_FK(QWidget *parent) : QMainWindow(parent), ui(new Ui::EBL_FK)
{
    ui->setupUi(this);
kameraverbinden();
     //Timer zur Wiederhohlung und Aktualiesung der Bilddaten
     // timer bereitstellen
     qtimer = new QTimer(this);
        // verbinde Timer mit bildverarbeitungUndUpdateLabels
        connect(qtimer, SIGNAL(timeout()), this, SLOT(bildverarbeitungUndUpdateLabels()));
        //dauer der wiederholung in ms
        qtimer->start(25);
        //Zeige OPENCV Fenster für einstellungen
        connect(ui->actionKonfiguration,SIGNAL (triggered()), this, SLOT(einstellungAufruf()));

/*...*/

void EBL_FK::bildverarbeitungUndUpdateLabels()
{
/*...*/

    // Wandlung von  OpenCV Mat to Qt QImage und ausgabe Livebild
        //Qimage "live" erzeugen
        QImage live;
        // Matrix frame in QImage wandeln
         live = matToQImage(frame);
        //ausgabe von live in label live
        i->label_live->setPixmap(QPixmap::fromImage(live));

        
        //ACHTUNG
        //HIER nun versuch der übergabe an Dialog .....
    
        //Dieses Qimage soll dann im label_mask im Dialog myconfig gezeigt werden
        test_mat = matToQImage(frame);
        //So in diese Richtung würde meine Idee gehen, nur nach Slot komm ich nicht mehr weiter:
       // connect(this, SIGNAL bildverarbeitungUndUpdateLabels(test_mat), mconfig, SLOT myconfig::ui->label_mask;)

/*...*/
}

/*...*/

void EBL_FK::on_actionConfigdialog_triggered()
{
//    mconfig= new myconfig(this);
//    mconfig-> show();
}

void EBL_FK::keyPressEvent(QKeyEvent *e)
{
         if(e->text() == "d")
         {

            //anzeigen von dialog auf tastendruck
             mconfig= new myconfig(this);

            //hier war noch ein anderer versuch
             //connect(this,SIGNAL(bildverarbeitungUndUpdateLabels(test_mat)),
              //       mconfig::ui->label_mask,SLOT(setPixmap(QPixmap::fromImage(test_mat)));
             //ui->label_live->setPixmap(QPixmap::fromImage(live))


             mconfig-> show();


             konfiguration=!konfiguration;

         }

}





dan habe ich eine Dialog:
myconfig.h

Code: Alles auswählen

 #ifndef MYCONFIG_H
#define MYCONFIG_H
#include <QDialog>
namespace Ui {
class myconfig;
}
class myconfig : public QDialog
{
    Q_OBJECT
public:
    explicit myconfig(QWidget *parent = 0);
    Ui::myconfig *ui;
    QImage lblmask;

    ~myconfig();
private:
};
#endif // MYCONFIG_H
mit der dazugehöärigen myconfig.cpp

Code: Alles auswählen

 #ifndef MYCONFIG_H
#define MYCONFIG_H
#include <QDialog>
namespace Ui {
class myconfig;
}
class myconfig : public QDialog
{
    Q_OBJECT
public:
    explicit myconfig(QWidget *parent = 0);
    Ui::myconfig *ui;
    QImage lblmask;
    ~myconfig();
private:
};
#endif // MYCONFIG_H
in den myconfig steht nmoch niochts, da ich nicht weiß, ob ich dort übehapt was eintragen muss, denn ich will ja nur zum UI ....

kann mir jemand sagen, wie ich weiterkomme?, Danke

Re: Signal Slot Qpixmap von mainwindow zu dialog (auch OPENC

Verfasst: 5. März 2016 08:56
von Christian81
myconfig eine setter() - Methode geben welche das Bild entgegennimmt und dort das Bild auf das QLabel setzen. Da ist kein Signal/Slot nötig.

Re: Signal Slot Qpixmap von mainwindow zu dialog (auch OPENC

Verfasst: 5. März 2016 10:45
von dbspl
Danke, könntest du deine Antwort konkretisieren? evt anhand eines beispiels?

und ginge das auch über signal slot?

Danke vg

Re: Signal Slot Qpixmap von mainwindow zu dialog (auch OPENC

Verfasst: 5. März 2016 13:44
von Christian81
Ob man eine Funktion aufruft oder ein Signal welches einen Slot ist im Grunde das Gleiche.
Einen setter zu schreiben der das QImage übergibt und dann Qlabel::setPixmap() (QImage -> QLabel per QPixmap::fromImage) sollte ja drin sein.

Re: Signal Slot Qpixmap von mainwindow zu dialog (auch OPENC

Verfasst: 5. März 2016 17:55
von dbspl
Danke, habe es nun so gelötst:
habe mir in myconfig.h eine funktion geschrieben:
(sind inzwischen 3 Qimages die übergeben werden....)

Code: Alles auswählen

void refresh(QImage* MaskFramesForConfig, QImage* Tresh1ForConfig, QImage* Tresh2ForConfig);
in der myconfig.cpp ist die Funtion definiert und gibt die QImages an die Label:

Code: Alles auswählen

void myconfig::refresh(QImage* MaskFramesForConfig, QImage* Tresh1ForConfig, QImage* Tresh2ForConfig)
{
    ui->label_mask->setPixmap(QPixmap::fromImage(*MaskFramesForConfig));
    ui->label_tresh_1->setPixmap(QPixmap::fromImage(*Tresh1ForConfig));
    ui->label_tresh_2->setPixmap(QPixmap::fromImage(*Tresh2ForConfig));
}
im header der Hauptdatei ebl_fk.h werden die QImages erzeugt

Code: Alles auswählen

     
//Include dialog
...
#include "myconfig.h"
...
myconfig* mconfig;
...

//qimage für dialog
     QImage MaskFramesForConfig, Tresh1ForConfig, Tresh2ForConfig;
im Hauptprogramm werden denn die QImages im Timer (25ms) an refresh übergeben (nachdem sie vorher befüllt wurden :-) ):

Code: Alles auswählen

mconfig->refresh(&MaskFrameForConfig,&Tresh1ForConfig,&Tresh2ForConfig);


Danke trotzrdem für die Hilfe!

wie kann man das Thema denn als gelöst markieren ?

Re: Signal Slot Qpixmap von mainwindow zu dialog (auch OPENC

Verfasst: 7. März 2016 09:59
von RHBaum
Anmerkung:

Ich verwend zum anzeigen von cv::mat meist nie den QPixmap umweg.
Ich lasse die in nem GL widget zeichenen.
Das ist zwar mehr Aufwand, aber wiederum auch nicht so viel .... wenn man sich mal da mit den grundlagen auseinandergesetzt hat.

Vorteile:

- Opencv Format -> QPixmap kann transformieren, wenn die Daten nicht in RGB aneinandergereiht vorliegen.
Der OpenGL renderer frisst wesentlich mehr formate und kommt auch mit stuffing zurecht -> aka weniger kopien.

- Du bist vom GUI Renderthread losgeloest. Du schreibst deine Mats als texture in den Grafikspeicher,
das kann von jeglichen thread aus passieren. Du musst also nicht GUI Thread synchron laufen sondern kannst direkt im Capture Thread ausliefern.
Der GuiThread stößt nur noch das Rendern an, welches auch wiederum dann entkoppelt (auf der Graka) laueft.

Für Prototypen und erste Schritte ist nen Video ueber nen QLabel sicher denkbar.
Aber für "ernsthafte" und mehr rechenintensive Programme solltest Dir mal andere Wege anschauen.
Und da Du OpenCV bemuehst, geh ich mal von aus das du mit den Videos auch was (rechenintensives) machen willst ...?

Professionelle Wege auf der 2D API gibts sicher auch ^^ Willst ne Media Integration, also nen Framework bauen wo andere (QT User) easy deine Videos einbinden können, ist QMediaContent sicher ne Option.

Ciao ...

Re: Signal Slot Qpixmap von mainwindow zu dialog (auch OPENC

Verfasst: 25. April 2016 18:49
von dbspl
Danke für die Info, ich werde es mir mal anschauen. Momentan geht es, wie du erraten hast um einen Prototyp.