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

C# Discussion :

Afficher une IplImage dans une picturebox


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut Afficher une IplImage dans une picturebox
    Bonjour,

    Alors je vais essayer de vous expliquez rapidement la situation. Je dévellope en ce moment une petite application sur VC++ 2005 express, qui doit afficher frame par frame une video dans plusieurs picturebox ( c'est une application Winform ).
    J'utilise par ailleurs la librairie OpenCV, pour le traitement de la video.

    Mon probleme est que, pour afficher une frame dans les picturebox, je doit d'abord sauvegarder cette frame en .bmp sur mon disque, pour ensuite la charger dans la picturebox. En effet les picturebox n'accepte pas le format IplImage d'OpenCV.

    De plus, je crée dès le chargement de la video, un vecteur de frame, avec toutes les frames de la video, pour pouvoir naviguer dans la vidéo sans temps de chargement à chaque déplacement dans cette dernière.

    Je voudrais savoir si quelqu'un connaissait un supterfuge pour pouvoir contourner ce problème. Je ne veux en effet pas sauvegarder cette image.bmp sur mon dur car l'application sera implanté sur un dsp, et donc j'ai des restrictions de mémoire...

    Donc pour résumer, comment afficher un format IplImage dans une picturebox sans sauvegarde sur le disque ?


    En ésperant avoir été assez precis,

    Merci énormément de votre aide !

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Voila dans le but d'etre un peu plus clair je vous inscrit ici l'erreur que mon compilateur me met lors de la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664: 'void System::Windows::Forms::PictureBox::Load(System::String ^)' : impossible de convertir le paramètre 1 de 'IplImage' en 'System::String ^'
    Voila, et voudrais rajouter aussi que si quelqu'un connait une autre methode pour afficher une image d'openCV dans une winform je suis preneur ! En effet, je ne suis pas obligé d'utiliser les picturebox...


    EDIT : J'ai deja essayé le castage

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Tssss, tu crois peut-être que n'importe quoi est compatible avec n'importe quoi? Les développeurs de winforms n'ont pas à se soucier de ceux d'opencv et vice-versa.
    Pour convertir tes images en ram, tu as plusieurs solutions. Une (simpliste) consisterait à sauver ton image en bmp mais pas sur le disque, dans un buffer mémoire (si opencv contient un système de flux c'est envisageable), puis à construire un flux à la dotnet par dessus ce buffer (pas atrocement compliqué si ça ressemble à du java) pour pouvoir relire ton bmp à partir de ce flux la. Ce sera un peu plus rapide mais toujours pas top, et bouffera pas mal de mémoire.
    La meilleure solution consisterait à prendre bien connaissance de la conception des classes d'image en opencv et en dotnet pour pouvoir convertir de l'un vers l'autre. C'est un peu plus hard, mais en ne gérant qu'un seul type de représentation d'image c'est jouable. Pour cela il faut savoir que quel que soit la biblio utilisée, une image est toujours définie par:
    - un type de pixel (le plus simple étant de toujours utiliser du RGB 24 bits voir du rgba si nécessaire)
    - hauteur largeur en pixel (forcément)
    - un pitch, le nombre de pixels utilisé pour représenter une ligne de l'image (c'est bizarre, mais ce n'est pas forcément nbre bytes pour un pixel*largeur, ça peut par exemple être obligatoirement multiple de 4, c'est pour ça qu'il faut se méfier)
    - tes données, qui peuvent être représentées dans un seul tableau, soit en décomposant R, G et B dans trois tableaux de bytes séparés (les biblios de manipulation d'images comme opencv utilisent parfois avec ce format la)
    Voila, tu as de quoi t'amuser

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Merci de ton aide Zais, comme le dis si bien ta signature, je me suis "inspiré" et maintenant j'ai mon image converti en format HBITMAP, donc en mémoire.

    On va dire, premiere étape remplie avec succès !

    Mais il me reste un probleme à résoudre, en effet les picturebox n'accepte comme paramètre que des System::String^ , donc des choses du genre "mypicture.bmp".

    Je ne sais pas comment faire pour lui envoyer en paramètre mon format HBITMAP...


    J'ai encore besoin de toi Zais !

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 631
    Points : 30 707
    Points
    30 707
    Par défaut
    Salut,

    Il faut voir comment tu charge "normalement" la picturebox, mais...

    Il y a de fortes chances que ce soit sous une forme (plus ou moins) proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PictureBox *img=new PictureBox("monimage.bmp");
    img->load();
    Si oui, il faut voir si tu n'a pas une méthode du genre de setbuffer, ou, si tu préferes, un acces en écriture au buffer de ta picturebox.

    L'idée est donc, en prenant en compte une éventuelle exception lancée par la picturebox si le fichier n'existe pas, de partir sur une idée du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PictureBox *img=new PictureBox("");//on n'a pas de nom de fichier, donc
                                       //on n'en fournit pas ;)
    img->SetBuffer(TonImageConvertie);//où ton image convertie est
                                      //ta HBITMAP ;)
    Je précise que je n'ai pas l'habitude des winforms, mais, je serais surpris que tu ne dispose pas d'une méthode proche de cette optique

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Merci de votre aide,

    mais je viens de regarder et aucune fonction de chargement de buffer ou autre.

    Voila comment je charge dans ma picturebox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pictureBox1->Load("mypicfilename.bmp");
    Et je n'ai pas trouvé d'autres fonctions, et Load n'admet qu'en paramètre une String, probleme car ce que je veux envoyer est une variable...

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 631
    Points : 30 707
    Points
    30 707
    Par défaut
    Et tu n'as aucune fonction qui puisse convenir

    Un SetImageBuffer, SetBufferImage, SetImage ou quoi que ce soit d'autre similaire, et qui prendrait un HBITMAP comme parametre

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 631
    Points : 30 707
    Points
    30 707
    Par défaut
    C'est peut etre de manière détournée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PictureBox->Buffer->SetBuffer(HBITMAP)
    PictureBox->Canvas->SetBuffer(HBITMAP)
    ou similaire...

    Cherche peut etre du coté des méthodes qui permettent de récupérer buffer non const (donc modifiable), et, de là, la méthodes qui permet de définir le buffer en question...

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 631
    Points : 30 707
    Points
    30 707
    Par défaut
    Une rapide recherche m'a mené à la propriété Image de ta PictureBox, qui dispose elle meme d'une méhtode FromHbitmap...

    Cela devrait donc pouvoir passer sous la form d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //soit ton HBITMAP sous la forme d'un pointeur nommé bitmap
    PicutreBox *img=new PictureBox;
    img->Image->FromHBitmap(bitmap);
    Quelques liens utiles
    l'explication de la méthode, la vue d'ensemble de la classe image et l'ensemble des propriétés de ta PicturBox

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Oui j'ai en effet bien trouver ta fonction koala, merci d'ailleurs, mais cette fonction accepte un IntPtr et non pas un HBITMAP...

    Je voulais juste donner l'information je continue à chercher !

    Mais je suis toujours preneur pour vos conseils avisés !!

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 631
    Points : 30 707
    Points
    30 707
    Par défaut
    Et, selon toi, HBitmap, c'est quoi

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par koala01
    Et, selon toi, HBitmap, c'est quoi
    Je sens que tu veux me coincer !

    Je dirai un pointeur vers une structure HBitmap...


    Mais lorsque je rentre en parametre bmp ( HBITMAP bmp ), il me dit que la conversion avec System::IntPtr est impossible.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Ce n'est pas possible qu'on ne puisse charger une image que depuis un fichier.
    Ca fait un bout de temps que je n'ai plus touché à du dotnet mais à l'époque j'avais du réaliser un mini programme de manipulation d'images, et toutes les modifications étaient faites en mémoire.
    Oublie la picture box, à vrai dire on s'en fout un peu, même si tu arrivais à t'en servir directement tu appelles ça de la bonne programmation? Quitte à faire des méthodes de conversion autant qu'elles soient génériques, et pas limitées à un seul composant graphique. L'important est de convertir ton image vers la classe pour les images en dotnet (heu, "Image" ou quelque chose qui y ressemble?).
    C'est quoi une HBITMAP? Une structure de mfc? De win32?

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Il me semble, mais je suis pas sur, que HBITMAP fait partie de windef.h.

    Pour ce que tu me disais, je suis pas restreint au picturebox, je peux changer de technique d'affichage. Mais les picturebox étaient assez facile d'acces pour quelqu'un qui n'a jamais fait du winform...
    De plus, ma petite application doit etre ergonomique, c'etait donc assez facile de placer ces picturebox ou je le souhaitais !

    Je pourrais utiliser quoi comme autres solutions ?

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bon j'ai enfin trouvé la solution, après multes essayage de convertion "à la main", beaucoup de ligne tapées, le résultat tient en une seul ligne...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int intStride = (image->width * image->nChannels + 3) & -4;
    pictureBox->Image=gcnew bitmap(image->width,image->height,intStride,Imaging::PixelFormat::Format24bppRgb,(IntPtr)image->imageData);

    La variable image étant mon IplImage ...


    voila voila ...

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

Discussions similaires

  1. [Débutant] Afficher des messages dans une RichTextBox dans une FORM
    Par Poulki dans le forum C#
    Réponses: 1
    Dernier message: 12/05/2015, 11h19
  2. Réponses: 5
    Dernier message: 15/09/2011, 23h53
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 14h35
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 11h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48

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