Signal Slot Qpixmap von mainwindow zu dialog (auch OPENCV)

Alles rund um die Programmierung mit Qt
Antworten
dbspl
Beiträge: 9
Registriert: 15. August 2015 16:44

Signal Slot Qpixmap von mainwindow zu dialog (auch OPENCV)

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dbspl
Beiträge: 9
Registriert: 15. August 2015 16:44

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

Beitrag von dbspl »

Danke, könntest du deine Antwort konkretisieren? evt anhand eines beispiels?

und ginge das auch über signal slot?

Danke vg
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dbspl
Beiträge: 9
Registriert: 15. August 2015 16:44

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

Beitrag 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 ?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

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

Beitrag 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 ...
dbspl
Beiträge: 9
Registriert: 15. August 2015 16:44

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

Beitrag von dbspl »

Danke für die Info, ich werde es mir mal anschauen. Momentan geht es, wie du erraten hast um einen Prototyp.
Antworten