IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques C++ Discussion :

[eVision + Qt] Comment convertir une EImage en QImage et l'afficher dans un QWidget?


Sujet :

Bibliothèques C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 10
    Points
    10
    Par défaut [eVision + Qt] Comment convertir une EImage en QImage et l'afficher dans un QWidget?
    Bonjour à tous,

    Je travaille sur un projet d'acquisition vidéo avec une carte EURESYS de la série Picolo.
    Je développe sous l'environnement Qt Creator (basé sur Qt 4.8.3) avec le compilateur MS VC++ 10 et j'utilise la bibliothèque eVision 6.7.1.

    Pour ce qui est de la configuration de la carte et de l'acquisition des images, il n'y a pas de problèmes. Avec OpenCV j'arrive à convertir l'EImage en Mat et à l'afficher dans une fenêtre secondaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void MainWindow::ProcessingCallback(Channel &Ch, SignalInfo &Info)
    {
        try
        {
            // Mise à jour de l'EImage à partir des données acquises
            UpdateImageConfig(*Info.Surf, EImgSrc);
     
            // Conversion de l'EImage en Mat
            Mat cvImg(EImgSrc.GetHeight(), EImgSrc.GetWidth(), CV_8UC3, EImgSrc.GetGenericImagePtr());
     
            // Affichage de l'image
            imshow( "Display window", cvImg );                   
        }
        catch (Euresys::MultiCam::Exception &e)
        {
            // Gestion des exceptions...
        }
     
    }
    Par contre avec Qt c'est une autre histoire.

    De la même manière j'ai utilisé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void MainWindow::ProcessingCallback(Channel &Ch, SignalInfo &Info)
    {
        try
        {
            // Mise à jour de l'EImage à partir des données acquises
            UpdateImageConfig(*Info.Surf, EImgSrc);
     
            // Conversion de l'EImage en QImage
            QImage imaq((const uchar*)EImgSrc.GetGenericImagePtr(), EImgSrc.GetWidth(), EImgSrc.GetHeight(), EImgSrc.GetBitsPerRow(), QImage::Format_RGB888);
     
            // Affichage de l'image
            QPainter painter(this);
            painter.drawImage(QPoint(0, 0), imaq);
        }
        catch (Euresys::MultiCam::Exception &e)
        {
            // Gestion des exceptions...
        }
    }
    Mais dans ce cas pas d'affichage de l'image et la sortie d'application m'indique en boucle le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPainter::begin: Paint device returned engine == 0, type: 1
    Pourriez-vous me donner quelques conseils?

    D'avance merci!

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Avec un bon coup de pouce (merci à anda_skoa ), j'ai réussi à résoudre le problème.

    Voici mon code modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void MainWindow::paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
        painter.drawImage(QPoint(0,0),currentImage);
    }
     
    void MainWindow::ProcessingCallback(Channel &Ch, SignalInfo &Info)
    {
        try
        {
            // Mise à jour de l'EImage à partir des données acquises
            UpdateImageConfig(*Info.Surf, EImgSrc);
     
            // Inversion des première et troisième composantes de couleur pour chaque pixel (EImage est codée en BVR)
            for(INT32 x=0; x<EImgSrc.GetWidth(); x++)
            {
                for(INT32 y=0; y<EImgSrc.GetHeight(); y++)
                {
                    EC24 pixE = EImgSrc.GetPixel(x, y);
                    UINT8 temp = pixE.m_un8C2;
                    pixE.m_un8C2 = pixE.m_un8C0;
                    pixE.m_un8C0 = temp;
                    EImgSrc.SetPixel(pixE, x, y);
                }
            }
     
            // Conversion de l'EImage en QImage
            QImage newImage((const uchar*)EImgSrc.GetGenericImagePtr(), EImgSrc.GetWidth(), EImgSrc.GetHeight(), QImage::Format_RGB888);
     
            // Affichage de l'image
            currentImage = newImage;
            this->update();
     
        }
        catch (Euresys::MultiCam::Exception &e)
        {
            // Gestion des exceptions...	
        }
    }
    Avec dans le fichier d'entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
     
    #include "EasyMultiCam.h"
     
    using namespace Euresys::MultiCam;
    using namespace Euresys::eVision::EasyMultiCam;
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow();
        EImageC24 EImgSrc;
        QImage currentImage;
    	// ...
     
    public slots:
        void ProcessingCallback(Channel &Ch, SignalInfo &Info);
    	// ...
     
    private slots:
        void paintEvent(QPaintEvent *);
    	// ...
     
    };
     
    #endif // MAINWINDOW_H
    Bonne continuation !

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Merci d'être passé nous donner ta solution!

    Pense à passer le sujet en [résolu]
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 05/05/2008, 15h35
  2. []Comment convertir une date GMT en date vb ?
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/08/2004, 16h01
  3. [C#] Comment convertir une image bmp en jpg !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2004, 20h37
  4. Réponses: 6
    Dernier message: 14/02/2004, 14h01
  5. Réponses: 3
    Dernier message: 28/09/2003, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo