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 du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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 du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Merci d'être passé nous donner ta solution!

    Pense à passer le sujet en [résolu]

+ 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