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

Qt Discussion :

Redimensionner une image automatiquement (OpenCV => QT)


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 63
    Points : 44
    Points
    44
    Par défaut Redimensionner une image automatiquement (OpenCV => QT)
    Hello ! :-)

    Version de QT : 4.6
    OS de programmation : Linux & Mac

    Je travaille sur un programme utilisant OpenCV pour récupérer des images d'un flux vidéo. L'idée est de récupérer les images, les traiter, et les afficher à l'écran. Mon but est d'afficher des images sur un fond noir, un peu comme si on lançait une vidéo en plein écran (fond noir et vidéo aggrandie au maximum ^^)

    1°) J'ai réussi à trouver et adapter un code permettant de passer d'une IplImage à une QImage (si quelqu'un le veut je lui donne :-)).
    2°) J'ai trouvé un bon petit tutorial permettant de façonner sa propre fenêtre. Me permettant ainsi plus tard de faire une fenêtre à fond noir prenant tout l'écran et afficher mon image au milieu.

    En fait je voulais avoir votre avis pour la redimension de l'image et son affichage. Actuellement pour afficher l'image convertie je fais quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->imageLabel->setPixmap(QPixmap::fromImage(*dataQT));
    Mes questions (qui se complètent ^^)
    1°) Est-ce qu'il y a un meilleur moyen d'afficher une QImage (et est-ce le meilleur format pour ce que je veux faire) ? Ou est-ce déjà un choix "correct" ?
    2°) Y-a-t-il un moyen avec QT de faire une redimension automatique de l'image selon la taille de la fenêtre sans devoir le faire de manière barbare sous OpenCV ?

    Merci à vous :-)
    Bonne semaine !
    Vincent

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    1)Oui il y a mieux que passer par un label (dont le repaint est trop lourd). Le mieux est de redéfinir le paintEvent d'un QWidget et d'utiliser la méthode QPainter::drawImage().

    Voici une petite classe qui pourrait te servir :
    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
    class VideoWin : public QWidget
    {
    public:
    	VideoWin ( QWidget * parent = 0, Qt::WindowFlags f = 0 ) : QWidget  (parent,f){};
     
    	void setImage(QImage newImage)
    	{
    	currentImage=newImage;
    	this->repaint();
    	}
     
    	void paintEvent ( QPaintEvent * event )
    	{
    	QPainter painter(this);
    	painter.drawImage(this->pos(),currentImage);
    	}
     
    	QImage currentImage;
    };
    2)Il y a la méthode QImage::scaled(...) qui va bien pour redimensionner ton image à la taille voulue.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Hello,

    Merci pour tes réponses pertinentes :-)
    Je vais regarder ça de plus près tout de suite !

    Sinon en passant ^^
    J'ai créé une fenêtre avec QT dans une autre classe que ma boucle OpenCV (qui récupère les images).
    OpenCV avant récupérait les évènements claviers, mais en créant cette fenêtre avec QT il a prit la main sur les events clavier.

    Est-ce qu'il y a un moyen pour que quand on créé la fenêtre on lui dise de ne pas se soucier des events clavier ^^ ?

    Merci encore :-)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    si tu n'utilises pas la partie GUI d'OpenCV il ne devrait pas prendre en charge les events claviers

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Effectivement pour les events clavier c'est possible... :-) merci !

    J'ai réussi à modifier la taille de la QImage, effectivement la méthode est bien foutue, merci encore !

    Par contre pour afficher la QImage directement dans le paintEvent, bof :-|
    J'avais déjà un peu touché cet aspect avec un autre programme ou je dessinais des formes, donc j'avais plus ou moins le modèle (qui est en gros le même qu'indiqué plus haut ^^). Mais quand j'essaye d'afficher mon image directement dans l'event et non dans le Label ça me fait un Bus Error :-( je comprends vraiment pas -_-

    Voilà ma méthode de paint, sachant que dataQT est une QImage*. J'ai essayé sans le scale avec un *dataQT mais ca fait aussi un busError.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Screen::paintEvent(QPaintEvent * event) {
     
    	QDesktopWidget desktop;
    	QPainter painter(this);
    	painter.drawPixmap(QPoint(0, 0), QPixmap::fromImage(this->dataQT->scaled(QSize(desktop.width(), desktop.height()), Qt::KeepAspectRatio)));
    	painter.end();
     
    }
    Bref, je capte vraiment rien à cette erreur de *** ^^
    Une idée ou un conseille de debug ? Je suis à court d'idée :-p Bon au pire je la laisse dans le Label, mais c'est moins performant et moins beau ^^ (et en plus y'a des marges/padding qui me font chier ^^)

    Encore merci pour le coup de main :-)
    Vincent

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Déjà, tu peux utiliser QPainter::drawImage() au lieu de passer par un QPixmap( tu perds du temps pour rien).

    Sinon, tu peux être un peu plus explicite sur ton "bus error" (je n'ai jamais entendu parler de ça).

    Sinon, tu peux déjà essayer avec une image bidon, venant d'un fichier, pour voir si le problème est lié à OpenCV, ou juste à une mauvaise utilisation (de tes pointeurs) du paintEvent.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Ouip j'ai testé aussi avec drawImage, pareil ^^

    J'ai effectivement testé une image déjà dans le projet, elle elle s'affiche.

    J'ai essayé de mettre une QImage non allocé qui contenait l'image (et s'affichait bien aussi dans un Label), pareil, bus error.

    Sinon pour Bus Error : http://en.wikipedia.org/wiki/Bus_error :-) très connu quand on a fait du C ^^

    J'avoue que je ne vois pas trop pourquoi il me fait ça. Surtout que j'ai tenté de lui donner une image "scaled", donc en principe "propre". Donc j'imagine que ca vient de mon image à un autre niveau, il doit vraiment pas supporter un truc :p

    Edit : faudrait effectivement que je regarde un peu plus si c'est pas le pointer que je sauvegarde qui "bug". Mais c'est quand même bien bizarre ^^, je sauvegarde le pointer de mon image dans une variable de la classe que j'utilise dans le paintEvent. Mais j'ai rien de threadé, donc devrait pas y avoir un problème d'utilisation "commune" de la variable en même temps.
    En clair, je suis paummé, je vais continuer de chercher :-p

    Merci :-)

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Bus_error :-) très connu quand on a fait du C ^^
    Ah ok, c'est en gros un "segmentation fault" (même si c'est un peu plus large si j'ai bien compris).

    Donc, ton pointeur sur l'image doit être mal initialisé, c'est tout. C'est sans doute même l'appel à scaled() qui plante, et non le drawImage().

    Utilise une image alloué statiquement pour vérifier (voire même pour ton application, ça te simplifiera la gestion mémoire).

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    Faut pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QDesktopWidget desktop;
    http://qt.developpez.com/doc/latest/...desktop-widget

    Utilise tu un debugeur?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Re,

    Donc, ton pointeur sur l'image doit être mal initialisé, c'est tout. C'est sans doute même l'appel à scaled() qui plante, et non le drawImage().
    J'avais essayé sans le scaled ;-)

    Utilise une image alloué statiquement pour vérifier (voire même pour ton application, ça te simplifiera la gestion mémoire).
    J'ai essayé aussi :-( pareil.
    Cette dernière alloué statiquement passe pareil nikel dans un Label, mais pas du tout dans le paintEvent.

    Cette aprem je fais des tests supplémentaires sur mon image dans le paintEvent et puis je reviens donner mon avis ici :-) ca doit bien être un truc con -_-

    * j'ai réglé mon soucis de keyEvent avec un eventFilter, super pour manger les Events d'autres classes :-)

    Encore merci !
    (dès que j'ai trouvé cette erreur je place le sujet en résolu, promis :-p)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Bon c'est moi qui avait oublié que l'image était à NULL au début et que le paintEvent n'est pas appelé que par moi mais automatiquement aussi ^^



    Merci :-)

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

Discussions similaires

  1. Redimensionner une image automatiquement lors de l'ajout ?
    Par polux31 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/05/2011, 13h23
  2. Redimensionner une image automatiquement
    Par xycoco dans le forum IHM
    Réponses: 1
    Dernier message: 16/10/2008, 11h04
  3. Redimensionner une image automatiquement
    Par Romuald632 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/09/2008, 09h24
  4. [VB.NET] Redimensionner une image proportionnelement
    Par Monster77 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2004, 12h10
  5. [MX2004] redimensionner une image lors du chargement
    Par ouinouin dans le forum Flash
    Réponses: 8
    Dernier message: 18/02/2004, 18h32

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