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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    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 averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    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 émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    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...

+ 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, 10h19
  2. Réponses: 5
    Dernier message: 15/09/2011, 22h53
  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, 13h35
  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, 10h13
  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, 13h48

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