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

Interfaces Graphiques Discussion :

Afficher une vidéo dans une interface graphique


Sujet :

Interfaces Graphiques

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut Afficher une vidéo dans une interface graphique
    Bonjour.

    Voila je cherche à afficher une vidéo issue d'une camera branché sur un port usb (le pilote est installé il fonctionne bien) dans un subplot d'une interface graphique. Pour ça j'utilise la fonction preview qui permet d'afficher une image en direct dans une nouvelle fenêtre.

    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
    vid = videoinput('winvideo', 2,vidRes); % Je défini ou ce trouve
    la camera (numero 2) et la résolution (visRes est défini dans un autre fichier)
    set(vid, 'SelectedSourceName', 'input1')
    src_vid = getselectedsource(vid);
    frame = getsnapshot(vid); % permet de créer une image fixe
    
    hFig = figure('position',[400 400 600 400],...
        'Toolbar','none',...
        'Menubar','none',...
        'NumberTitle','Off',...
        'Name','Video with Live Histogram'); % la figure
    
    h_start = uicontrol('Style', 'pushbutton', 'String', 'Start Preview',...
        'Position', [10 360 100 30], 'Callback', 'preview(vid)');  % un bouton qui permet de démarrer la preview.
    
    h_stop = uicontrol('Style', 'pushbutton', 'String', 'Stop Preview',...
        'Position', [120 360 100 30], 'Callback', 'stoppreview(vid)'); % un bouton censé l'arrêter mais visiblement la fonction 
    n'existe pas.
    
    h_close = uicontrol('Style', 'pushbutton', 'String', 'Close',...
        'Position', [230 360 100 30], 'Callback', 'close'); % Un
    bouton permettant de fermer la fenêtre, je voudrais aussi qu'il efface la vidéo
    pour ne pas encombrer la mémoire mais je n'arrive pas a rajouter la fonction 
    'delete(vid)' en plus de 'close'.
    
    hTextLabel = uicontrol('Style', 'text', 'String', 'Time Stamp',...
        'Position', [10 0 100 20], 'Callback', 'cla'); %pour afficher le temps qui défile
    
    h_camera = subplot('Position', [0.04 0.2 0.45 0.65]); preview(vid); % et voila le principal problème, si je met une fonction genre
    image(frame) pour afficher l'image instantané elle apparait bien dans le 
    subplot la mais la preview non, elle apparait dans une nouvelle 
    fenêtre.
    
    h_histogram = subplot('Position', [0.54 0.2 0.45 0.65]);
    Voila est-ce que quelqu'un a une idée de comment réparer ça?
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Bonjour,

    Il y a plusieurs problèmes :
    1. Le vert c'est illisible (désolée )
    2. Ta variable vid n'est connue que dans le corps de la fonction principale et pas dans les callbacks.
    voir la FAQ :Existe-t-il plusieurs types de définitions de variables ?

    Je te conseille fortement de faire tes callbacks dans des fonctions séparées qui te permettront de mieux visualiser ce que tu veux faire (et aussi de faire une succession de commandes).

    Pour plus d'infos le tutoriel : Développement efficace des interfaces graphiques (GUI)
    devrait t'aider.

    Et pour preview de ce que je comprends de l'aide, pour que la video s'affiche dans ton GUI il faut faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hFrame)image(frame);
    preview(vid,hFrame);

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour, déjà merci pour la réponse précédente malheureusement je suis une kiche donc me revoila.

    Voila j'ai essayez de séparer les fonctions des callback avec des sous fonctions de type nested.
    Pour la preview dans la fenêtre graphique j'ai laissé tombé de toute façon c'est plus pratique de l'avoir en grand à coté.

    J'ai essayer de développer un peu les choses avec une fonction qui permet de faire un snapshot de la vidéo en cliquant sur un bouton pour avoir une image qu'on va ensuite analyser. Il faudrait aussi que cela recrée l'image et l'affiche à la place de la précédente à chaque fois que je clique sur le bouton, je ne suis pas sur que ça le fasse automatiquement actuellement ou si il faut rajouter des commandes.

    L'autre fonction est fait pour compter un nombre d'éléments sur la photo (dans le cas présent des cellules sur une lame de microscope), on fait subir plusieurs traitement à l'image genre augmentation du contraste, passage en noir et blanc puis on utilise la fonction bwlabel pour compter le nombre d'éléments blanc.

    Cela fonctionne très bien de façon indépendante mais bien sur je n'arrive pas à faire fonctionner les boutons, et je ne suis pas du tout sur que les images et le nombre d'élément vont s'afficher au bonne en droit.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    function ContageCellules
    
    close all;
    clear all;
    
    vid = videoinput('winvideo', 2);
    
    set(vid, 'ReturnedColorSpace', 'grayscale'); 
    
    % c'est nécessaire pour passer de 768x1024x3 à 768x1024 pour pouvoir analyser l'image derrière
    
    set(vid, 'SelectedSourceName', 'input1');
    
    src_vid = getselectedsource(vid);
    
    preview(vid); 
    
    % la preview se lance en grande fenêtre en même temps que
    l'interface graphique permettant de sélectionner facilement une zone pour
    ensuite prendre une photo.
    
    handles(1)=figure('position',[100 100 1000 700],...
        'Toolbar','none',...
        'Menubar','none',...
        'NumberTitle','Off',...
        'Name','Video avec comptage de cellule'); 
    
    
    handles(2)=uicontrol('Style', 'pushbutton',... 
                         'String', 'Photo',...
                         'Units','normalized',...
                         'Position', [0 0 0.15 0.07],...
                         'Callback', '@prisephoto;'); 
                     
    % avec les sous fonctions du type nested je crois qu'il faut
    appelé les fonction dans les callback @nomdelafonction.
    
    handles(3)=uicontrol('Style', 'pushbutton',... 
                         'String', 'Contage',...
                         'Units','normalized',...
                         'Position', [0.17 0 0.15 0.07],... 
                         'Callback', '@contage;');
    
    handles(4)=uicontrol('Style', 'pushbutton',...
                         'String','Close' ,...
                         'Units','normalized',...
                         'Position', [0.34 0 0.15 0.07],...
                         'Callback', '@fermer;');
    
    handles(5)=uicontrol('Style', 'text',... 
                         'String', '0',...
                         'Units','normalized',...
                         'Position', [0.85 -0.04 0.15 0.08],...
                         'tag','résultat');
    
    handles(6)=subplot('Position', [0.54 0.2 0.45 0.65]);
    
    handles(7)=subplot('Position', [0.04 0.2 0.45 0.65]);
    
    % j'ai fait des sous fonctions du type nested mais cela ne
    semble pas fonctionner, d'où vient le problème exactement? des noms des
    sous-fonctions peut-être?
    
        function [frame] = prisephoto(vid)
        
        clear frame; % je voudrais pouvoir refaire une photo à chaque clique,
    est-ce qu'effacer la précédente est nécessaire?
        frame = getsnapshot(vid);
        set(handles(6),imshow(frame)); % comment configurer l'endroit ou faire
    apparaitre l'image?
        colormap(gray); % il y a un problème au niveau des couleurs de l'image
    affiché il faut donc les repasser en niveau de gris
        
        end
    
    
        function [nombreobjets] = contage(frame)
        
    % est-il possible de mettre cornee1 pour toutes les matrices
    intermédiaires ne comptant que sur l'ordre des commandes?
    
        h = fspecial('unsharp');
        cornee1 = imfilter(frame,h); 
        cornee2 = histeq (cornee1);
        cornee3= medfilt2(cornee2,[3 3]);
        cornee4 = imadjust(cornee3);
        level = graythresh(cornee4);
        cornee5 = im2bw(cornee4,level);
        [labeled,numObjects] = bwlabel(cornee5,4);
        nombreobjets = numObjects;
        set(handles(5),'string', num2str(nombreobjets)); 
    
    % même problème, comment faire pour afficher le nombre
    d'objets dans la fenêtre de type text?
    
        set(handles(7), imshow(cornee6)); % 
       
    % pour afficher le nombre d'objet on peut voir qu'il y a 'string'
    qui indique probablement qu'il faut remplacer le string du handle(5) y a t'il un
    équivalent pour dire ou mettre les images?
        
        end
    
        function fermer
        
        close all;
        delete(vid);
        clear vid;
        
        end
    
    end
    Voila, plus ça avance plus il y à de problème.

    Et désolé pour le vert de la dernière fois, j'ai changé sa, pourtant ca donnais pas mal sur mon écran.

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    On va essayer d'attaquer les problèmes 1 par 1.
    Déjà pour tes nested function il ne faut pas mettre d'entrées/sorties exceptées celles que MATLAB met par défaut quand ces fonctions sont définies dans des callbacks.
    Je te conseillerais donc par exemple pour prisephoto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function prisephoto(varargin)%on ne se servira pas des entrées mais on met varargin car MATLAB va mettre des entrées par défaut
    Comme c'est une nested function, vid sera connue dedans (normalement car je ne suis pas une pro des nested ).

    La fonction prisephoto :Ceci efface la variable frame => ça ne sert à rien cette variable est automatiquement écrasée par la ligne d'après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(handles(6),imshow(frame)); % comment configurer l'endroit ou faire apparaitre l'image?
    Je suppose que ceci ne fonctionne pas.
    Tu peux utiliser la propriété Parent avec imshow pour lui dire l'axe où tu veux faire l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imshow(frame,'Parent',handles(6));
    J'ai juste un doute sur le fait que handles(6) retourné par subplot soit bien le handle de l'axe...A vérifier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    % est-il possible de mettre cornee1 pour toutes les matrices intermédiaires ne comptant que sur l'ordre des commandes?
    Si la question est de savoir si tu peux réécraser cornee1 à chaque fois la réponse est oui si tu n'as pas besoin des variables intermédiaires. C'est même mieux au niveau de la gesiton de la mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set(handles(5),'string', num2str(nombreobjets)); 
    
    % même problème, comment faire pour afficher le nombre
    d'objets dans la fenêtre de type text?
    Je ne comprends pas le code ci-dessus doit fonctionner, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set(handles(7), imshow(cornee6)); % 
       
    % pour afficher le nombre d'objet on peut voir qu'il y a 'string'
    qui indique probablement qu'il faut remplacer le string du handle(5) y a t'il un
    équivalent pour dire ou mettre les images?
    Pareil qu'au-dessus : utilise la propriété Parent.

    Je crois que c'est à peu près tout.

    PS : le bleu c'est mieux

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Merci déjà des éclaircissement j'ai modifié tout ce que tu avais indiqué mais cela persiste à ne pas fonctionner, l'interface graphique se lance bien ainsi que la preview mais quand j'appuie sur les boutons il ne se passe rien, même pas de messages d'erreurs, aucune fonction ne se lance aucune matrice n'est créer mon workspace reste désespérément vide ce qui est quand même étrange il ne devrais pas au moins me créer vid au lancement du programme?
    Même le bouton fermer ne fonctionne pas.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    function ContageCellules
    
    close all;
    clear all;
    
    vid = videoinput('winvideo', 2);
    
    set(vid, 'ReturnedColorSpace', 'grayscale'); 
    
    % c'est nécessaire pour passer de 768x1024x3 à 768x1024 pour pouvoir analyser l'image derrière
    
    set(vid, 'SelectedSourceName', 'input1');
    
    src_vid = getselectedsource(vid);
    
    preview(vid); 
    
    % la preview se lance en grande fenêtre en même temps que
    l'interface graphique permettant de sélectionner facilement une zone pour
    ensuite prendre une photo.
    
    handles(1)=figure('position',[100 100 1000 700],...
        'Toolbar','none',...
        'Menubar','none',...
        'NumberTitle','Off',...
        'Name','Video avec comptage de cellule'); 
    
    handles(2)=uicontrol('Style', 'pushbutton',... 
                         'String', 'Photo',...
                         'Units','normalized',...
                         'Position', [0 0 0.15 0.07],...
                         'Callback', '@prisephoto;'); 
                     
    % avec les sous fonctions du type nested je crois qu'il faut
    appelé les fonction dans les callback @nomdelafonction.
    
    handles(3)=uicontrol('Style', 'pushbutton',... 
                         'String', 'Contage',...
                         'Units','normalized',...
                         'Position', [0.17 0 0.15 0.07],... 
                         'Callback', '@contage;');
    
    handles(4)=uicontrol('Style', 'pushbutton',...
                         'String','Close' ,...
                         'Units','normalized',...
                         'Position', [0.34 0 0.15 0.07],...
                         'Callback', '@fermer;');
    
    handles(5)=uicontrol('Style', 'text',... 
                         'String', '0',...
                         'Units','normalized',...
                         'Position', [0.85 -0.04 0.15 0.08],...
                         'tag','résultat');
    
    handles(6)=subplot('Position', [0.54 0.2 0.45 0.65]);
    
    handles(7)=subplot('Position', [0.04 0.2 0.45 0.65]);
    
    % Alors j'ai modifié les noms des fonctions comme indiquer mais
    cela ne fonctionne toujours pas.
    
        function prisephoto(varargin)
        
        frame = getsnapshot(vid);
        imshow(frame,'Parent',handles(6));
        colormap(gray); % il y a un problème au niveau des
    couleurs de l'image affiché elles sont type hsv
        
        end
    
    
        function contage(varargin)
        
        h = fspecial('unsharp');
        cornee1 = imfilter(frame,h);
        cornee1 = histeq (cornee1);
        cornee1= medfilt2(cornee1,[3 3]);
        cornee1 = imadjust(cornee1);
        level = graythresh(cornee1);
        cornee1 = im2bw(cornee1,level);
        [labeled,numObjects] = bwlabel(cornee1,4);
        nombreobjets = numObjects;
        set(handles(5),'string', num2str(nombreobjets));
        imshow(cornee1,'Parent',handles(7));
       
        end
    
        function fermer
        
        close all;
        delete(vid);
        clear vid;
        
        end
    
    end

  6. #6
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Tu n'auras aucune variable créée dans le workspace (revoir le lien que je t'ai donné précédemment sur les variables). Elles n'existent que dans la fonction.
    Ce qui fait d'ailleurs que le dans la fonction fermer ne sert à rien.

    Pour les callbacks oui un truc que j'avais pas vu : avec les function handles (les @) il ne faut pas les mettre en format string (ie avec des quotes '').
    C'est plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uicontrol(...
       'Callback',@mafonction,...
       ...);
    C'est bizarre par contre qu'il n'y ait même pas un message d'erreur.

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    En effet cela fonctionne beaucoup mieux sans les ' ', enfin dans le sens ou désormais j'ai des messages d'erreur.

    Donc quand je clique sur le premier bouton pour le snapshot ca donne :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    ??? Error using ==> imuitools\private\imageDisplayParseInputs
    Invalid input arguments.
     
    Error in ==> imshow at 144
      [cdata, cdatamapping, clim, map, xdata, ydata, ...
     
    Error in ==> ContageCellules>prisephoto at 69
        imshow(frame,'Parent',handles(6));
     
     
    ------------------------------------------------------------------------
                 Assertion detected at Tue May 06 14:09:45 2008
    ------------------------------------------------------------------------
     
    Assertion failed: hdr->in_use != 0, at line 736 of file ".\memmgr\memcache.cpp".
    Attempt to free previously freed memory
     
     
    Configuration:
      MATLAB Version:   7.0.1.24704 (R14) Service Pack 1
      MATLAB License:   XXXXXX
      Operating System: Microsoft Windows 2000
      Window System:    Version 6.0 (Build 6001: Service Pack 1)
      Processor ID:     x86 Family 6 Model 15 Stepping 13, GenuineIntel
      Virtual Machine:  Java 1.4.2_04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
        (mixed mode)
      Default Charset:  ibm-5348_P100-1997
     
    Stack Trace:
      [0] bridge.dll:_mnSignalHandler(0xffffffff, 0, 0, 0x79c99b80) + 303 bytes
      [1] bridge.dll:void __cdecl ThrowAssertion(void)(0x02598e58, 0x78775a68, 0x65737341, 0x6f697472) + 164 bytes
      [2] bridge.dll:void __cdecl MATLABAssertFcn(char const *,char const *,int,char const *)(0x7874d4ec ": hdr->in_use != 0,", 0x7874d328 ".\memmgr\memcache.cpp", 736, 0x7874c590 "Attempt to free previously freed..") + 110 bytes
      [3] libut.dll:_mw_free(0x02598e60 "?_ioFlushFcn@@YAHPAUioCaptureRec..", 0x00cdad84, 0x78792a08, 0x02598e60 "?_ioFlushFcn@@YAHPAUioCaptureRec..") + 584 bytes
      [4] libut.dll:_utFree(0x02598e60 "?_ioFlushFcn@@YAHPAUioCaptureRec..", 0x02598e60 "?_ioFlushFcn@@YAHPAUioCaptureRec..", 0x0b08a634, 0x00cdad9c "¬*Í") + 100 bytes
      [5] libmx.dll:_mxDestroyArray(0x02598e60 "?_ioFlushFcn@@YAHPAUioCaptureRec..", 0, 3, 0x0b2c0ee0) + 56 bytes
      [6] libmx.dll:void __cdecl ExitArrayListContextFcn(int,bool,struct mxArray_tag * *,int,bool)(0, 0, 0x00cdae38 "H®Í", 0x790fd6b3) + 91 bytes
      [7] libmx.dll:_mxExitArrayListContext(0, 0, 0, 1) + 23 bytes
      [8] libmwgui.dll:$L66295(0x02585da0, 0x01592ce0, 0x00cdae94 "À®Í", 0x7920217a) + 103 bytes
      [9] libmwgui.dll:_ExecuteMCallback(0x0b4e3070, 0x02585da0, 0x02592ce0, 0x0b5ad0d0) + 19 bytes
      [10] hg.dll:enum inExecutionStatus __cdecl goCallEventCallback(struct GObject_tag *,class MCallback *,char const *,void (__cdecl*)(struct GObject_tag *,void *),void *,void (__cdecl*)(struct GObject_tag *,void *),struct mxArray_tag *)(0x0b5ad0d0, 0x7924c980 "Callback", 0x01097170, 0) + 346 bytes
      [11] hg.dll:_goCallCallback(0x0b5ad0d0, 0x0b4e3070, 0x7924c980 "Callback", 0x791e3400) + 152 bytes
      [12] hg.dll:_uicontrolEventHandler(0x0b5ad0d0, 0x02592ce0, 0, 0x0afaf798) + 357 bytes
      [13] hg.dll:public: virtual void __thiscall UIControlJavaDisplayManager::Activated(class UDInterface *,class DisplayManager *,void *)(0x0af29e90, 0x02a65680, 0x098b162c, 0x00cdaf80 "¨¯Í") + 101 bytes
      [14] hg.dll:public: virtual void __thiscall DefaultJavaViewContainer::JavaViewActionCallback(class UDInterface *,class JavaViewContainer *,void *)(0x0af29e90, 0x02a656a8, 0x098b162c, 0x00cdafa8 "ȯÍ") + 45 bytes
      [15] hg.dll:public: static void __cdecl DefaultJavaViewContainer::JavaViewActionCallbackDispatch(class UDInterface *,class JavaViewContainer *,void *,bool)(0x0af29e90, 0x02a656a8, 0x098b162c, 0x098b1600) + 20 bytes
      [16] hg.dll:public: virtual bool __thiscall JavaEventListener::execute(class UDEvent *)(0x0af2b830, 0x0afefa58, 0x0af29e90, 0x00cdb030) + 118 bytes
      [17] udd.dll:public: bool __thiscall UDListenerList::execute(class UDEvent *)(0x00cdb030, 0x00cdaff8, 0x788da569, 0x0afaf798) + 83 bytes
      [18] udd.dll:public: virtual void __thiscall UDListenerManagerHost::notifyEvent(class UDDatabaseClient *,class UDEventSource const *,class UDEventInfo const *,class UDEvent *)(0x0afaf798, 0x0af29e94, 0x0afefa58, 0x00cdb030) + 52 bytes
      [19] udd.dll:public: virtual void __thiscall UDEventInfo::send(class UDDatabaseClient *,class UDInterface *,class UDEvent *)(0x0afaf798, 0x0af29e90, 0x00cdb030, 0x0af29e90) + 57 bytes
      [20] udd.dll:public: void __thiscall UDInterface::send(class UDDatabaseClient *,class UDEventInfo *,class UDEvent *)(0x0afaf798, 0x0afefa58, 0x00cdb030, 0) + 85 bytes
      [21] udd_mi.dll:_ProcessBeanUDDEvent(96, 0x00cdb0b0, 0, 0x00cdb1a0) + 551 bytes
      [22] uiw.dll:bool __cdecl UIW_DispatchUserMessage(int,int)(9223, 96, 0, 0x00030000 "Actx ") + 76 bytes
      [23] uiw.dll:_HandleUserMsgHook@12(0, 1, 0x00cdb1a0, 0x7c342955) + 74 bytes
      [24] USER32.dll:0x7732bbeb(0x00030000 "Actx ", 1, 0x00cdb1a0, 0x7906f020)
      [25] USER32.dll:0x77319597(0x00cdb190, 0x00cdb1a0, 0x00cdb1bc, 0)
      [26] USER32.dll:0x7731968c(0x00cdb190, 48, 0x00cdb31c, 0x771f9980)
      [27] ntdll.dll:0x771f99ce(0x00cdb290, 0, 0, 0)
      [28] uiw.dll:char * __cdecl getCommand(char *,int,int)(0x0b68cea0, 4096, 255, 0x00cdb328 "D³Í") + 296 bytes
      [29] uiw.dll:public: virtual char * __thiscall uiw::UIW_IOProxy::getCmdWindowCommand(char *,int,int)const (0x0b68cea0, 4096, 255, 0x00cdf388) + 20 bytes
      [30] bridge.dll:char * __cdecl win32IoReadLine(int,struct _iobuf *,char *,char *,int,bool *)(255, 0x7c38b4e8, 0x0ae098a0, 4096) + 216 bytes
      [31] bridge.dll:char * __cdecl ioReadLine(int,struct _iobuf *,char *,char *,int,bool *)(255, 0x7c38b4e8, 0x0ae098a0, 0x0ae098a0) + 28 bytes
      [32] bridge.dll:void __cdecl mnGetFullLine(char * *,unsigned int *,unsigned int *,int)(0x00cdf38c, 255, 1, 0) + 54 bytes
      [33] bridge.dll:_mnGetCommandLineBuffer(255, 0x00cdf4ac, 0x00cdf464, 0x026551e0) + 92 bytes
      [34] bridge.dll:_mnParser(0x7710bb4d, 0x026551e0, 0, 0) + 364 bytes
      [35] mcr.dll:public: void __thiscall mcrInstance::mnParser(void)(1581497, 0x6d5c3a43, 0x616c7461, 0x69625c62) + 87 bytes
      [36] MATLAB.exe:0x00401d2f(4194304, 0, 1581497, 0x026551e0)
      [37] MATLAB.exe:0x00403e45(0x7ffd3000, 0x00cdffd4 "ìÿÍ", 0x771de4b6, 0x7ffd3000)
      [38] kernel32.dll:0x77104911(0x7ffd3000, 0x77148160, 0, 0)
      [39] ntdll.dll:0x771de4b6(0x00403cc0 "jth8U@", 0x7ffd3000, 0, 0)
      [40] ntdll.dll:0x771de489(0x00403cc0 "jth8U@", 0x7ffd3000, 0, 48)
     
    Please follow these steps in reporting this problem to The MathWorks so
    that we have the best chance of correcting it:
     
      1. Send this crash report to segv@mathworks.com for automated analysis.
         For your convenience, this information has been recorded in:
           C:\Users\MARTIN\AppData\Local\Temp\matlab_crash_dump.5500
     
      2. Also, if the problem is reproducible, send the crash report to
         support@mathworks.com along with:
           - A specific list of steps that will reproduce the problem
           - Any M, MEX, MDL or other files required to reproduce the problem
           - Any error messages displayed to the command window
         A technical support engineer will contact you with further information.
     
    Thank you for your assistance.  Please save your workspace and restart
    MATLAB before continuing your work.
    Si je clique sur l'autre il me dit que frame existe pas mais c'est normal vu que cela plante lorsque de la création.

    Et pour le bouton fermer il me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ??? Error using ==> ContageCellules>fermer
    Too many input arguments.
     
    ??? Error while evaluating uicontrol Callback.
    Merci encore de ta patience.

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Je commence par le facile :
    pour fermer il faut rajouter varargin en entrée comme je t'ai dis pour les autres.

    Pour le message d'erreur Whaou.
    Si tu essayes d'abord sans mettre le Parent (juste imshow(frame)) ça donne quelque chose ou aussi une erreur ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Donc pour la fonction fermer cela fonctionne maintenant.
    Pour la fonction prise photo il me remet le message d'erreur suivant, mais sans la partir qui concerne ce que j'ai enlevé. Mais bizarrement oh miracle il m'affiche l'image dans le bon carré (mais il prend quand même au moins 10/15 seconde pour sa). Seulement comme à la fin du message d'erreur il me demande de redémarrer matlab c'est plutôt gênant.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    ------------------------------------------------------------------------
                 Assertion detected at Tue May 06 14:20:43 2008
    ------------------------------------------------------------------------
     
    Assertion failed: hdr->in_use != 0, at line 736 of file ".\memmgr\memcache.cpp".
    Attempt to free previously freed memory
     
     
    Configuration:
      MATLAB Version:   7.0.1.24704 (R14) Service Pack 1
      MATLAB License:   XXXXXX
      Operating System: Microsoft Windows 2000
      Window System:    Version 6.0 (Build 6001: Service Pack 1)
      Processor ID:     x86 Family 6 Model 15 Stepping 13, GenuineIntel
      Virtual Machine:  Java 1.4.2_04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
        (mixed mode)
      Default Charset:  ibm-5348_P100-1997
     
    Stack Trace:
      [0] bridge.dll:_mnSignalHandler(0xffffffff, 0, 0, 0x79c99b80) + 303 bytes
      [1] bridge.dll:void __cdecl ThrowAssertion(void)(0x02698e58, 0x78775a68, 0x65737341, 0x6f697472) + 164 bytes
      [2] bridge.dll:void __cdecl MATLABAssertFcn(char const *,char const *,int,char const *)(0x7874d4ec ": hdr->in_use != 0,", 0x7874d328 ".\memmgr\memcache.cpp", 736, 0x7874c590 "Attempt to free previously freed..") + 110 bytes
      [3] libut.dll:_mw_free(0x02698e60 "??3?$Mvalue_common@VMimplementat..", 0x00cdad84, 0x78792a08, 0x02698e60 "??3?$Mvalue_common@VMimplementat..") + 584 bytes
      [4] libut.dll:_utFree(0x02698e60 "??3?$Mvalue_common@VMimplementat..", 0x02698e60 "??3?$Mvalue_common@VMimplementat..", 0x0b29bab4, 0x00cdad9c "¬*Í") + 100 bytes
      [5] libmx.dll:_mxDestroyArray(0x02698e60 "??3?$Mvalue_common@VMimplementat..", 0, 3, 0x0b500100) + 56 bytes
      [6] libmx.dll:void __cdecl ExitArrayListContextFcn(int,bool,struct mxArray_tag * *,int,bool)(0, 0, 0x00cdae38 "H®Í", 0x790fd6b3) + 91 bytes
      [7] libmx.dll:_mxExitArrayListContext(0, 0, 0, 1) + 23 bytes
      [8] libmwgui.dll:$L66295(0x0267e760, 0x01692420, 0x00cdae94 "À®Í", 0x7920217a) + 103 bytes
      [9] libmwgui.dll:_ExecuteMCallback(0x0b70fbb0, 0x0267e760, 0x02692420, 0x0b7c7a50) + 19 bytes
      [10] hg.dll:enum inExecutionStatus __cdecl goCallEventCallback(struct GObject_tag *,class MCallback *,char const *,void (__cdecl*)(struct GObject_tag *,void *),void *,void (__cdecl*)(struct GObject_tag *,void *),struct mxArray_tag *)(0x0b7c7a50, 0x7924c980 "Callback", 2028592, 0) + 346 bytes
      [11] hg.dll:_goCallCallback(0x0b7c7a50, 0x0b70fbb0, 0x7924c980 "Callback", 0x791e3400) + 152 bytes
      [12] hg.dll:_uicontrolEventHandler(0x0b7c7a50, 0x02692420, 0, 0x0b56b598) + 357 bytes
      [13] hg.dll:public: virtual void __thiscall UIControlJavaDisplayManager::Activated(class UDInterface *,class DisplayManager *,void *)(0x0b16b050, 0x02a65aa0, 0x01273498, 0x00cdaf80 "¨¯Í") + 101 bytes
      [14] hg.dll:public: virtual void __thiscall DefaultJavaViewContainer::JavaViewActionCallback(class UDInterface *,class JavaViewContainer *,void *)(0x0b16b050, 0x02a65ac8, 0x01273498, 0x00cdafa8 "ȯÍ") + 45 bytes
      [15] hg.dll:public: static void __cdecl DefaultJavaViewContainer::JavaViewActionCallbackDispatch(class UDInterface *,class JavaViewContainer *,void *,bool)(0x0b16b050, 0x02a65ac8, 0x01273498, 0x01273400) + 20 bytes
      [16] hg.dll:public: virtual bool __thiscall JavaEventListener::execute(class UDEvent *)(0x0b16c9f0, 0x0b21f400, 0x0b16b050, 0x00cdb030) + 118 bytes
      [17] udd.dll:public: bool __thiscall UDListenerList::execute(class UDEvent *)(0x00cdb030, 0x00cdaff8, 0x788da569, 0x0b56b598) + 83 bytes
      [18] udd.dll:public: virtual void __thiscall UDListenerManagerHost::notifyEvent(class UDDatabaseClient *,class UDEventSource const *,class UDEventInfo const *,class UDEvent *)(0x0b56b598, 0x0b16b054, 0x0b21f400, 0x00cdb030) + 52 bytes
      [19] udd.dll:public: virtual void __thiscall UDEventInfo::send(class UDDatabaseClient *,class UDInterface *,class UDEvent *)(0x0b56b598, 0x0b16b050, 0x00cdb030, 0x0b16b050) + 57 bytes
      [20] udd.dll:public: void __thiscall UDInterface::send(class UDDatabaseClient *,class UDEventInfo *,class UDEvent *)(0x0b56b598, 0x0b21f400, 0x00cdb030, 0) + 85 bytes
      [21] udd_mi.dll:_ProcessBeanUDDEvent(164, 0x00cdb0b0, 0, 0x00cdb1a0) + 551 bytes
      [22] uiw.dll:bool __cdecl UIW_DispatchUserMessage(int,int)(9223, 164, 0, 0x00030000 "Actx ") + 76 bytes
      [23] uiw.dll:_HandleUserMsgHook@12(0, 1, 0x00cdb1a0, 0x7c342955) + 74 bytes
      [24] USER32.dll:0x7732bbeb(0x00030000 "Actx ", 1, 0x00cdb1a0, 0x7906f020)
      [25] USER32.dll:0x77319597(0x00cdb190, 0x00cdb1a0, 0x00cdb1bc, 0)
      [26] USER32.dll:0x7731968c(0x00cdb190, 48, 0x00cdb31c, 0x771f9980)
      [27] ntdll.dll:0x771f99ce(0x00cdb290, 0, 0, 0)
      [28] uiw.dll:char * __cdecl getCommand(char *,int,int)(0x0b8c3228, 4096, 255, 0x00cdb328 "D³Í") + 296 bytes
      [29] uiw.dll:public: virtual char * __thiscall uiw::UIW_IOProxy::getCmdWindowCommand(char *,int,int)const (0x0b8c3228, 4096, 255, 0x00cdf388) + 20 bytes
      [30] bridge.dll:char * __cdecl win32IoReadLine(int,struct _iobuf *,char *,char *,int,bool *)(255, 0x7c38b4e8, 0x0b0398a0, 4096) + 216 bytes
      [31] bridge.dll:char * __cdecl ioReadLine(int,struct _iobuf *,char *,char *,int,bool *)(255, 0x7c38b4e8, 0x0b0398a0, 0x0b0398a0) + 28 bytes
      [32] bridge.dll:void __cdecl mnGetFullLine(char * *,unsigned int *,unsigned int *,int)(0x00cdf38c, 255, 1, 0) + 54 bytes
      [33] bridge.dll:_mnGetCommandLineBuffer(255, 0x00cdf4ac, 0x00cdf464, 0x027551e0) + 92 bytes
      [34] bridge.dll:_mnParser(0x7710bb4d, 0x027551e0, 0, 0) + 364 bytes
      [35] mcr.dll:public: void __thiscall mcrInstance::mnParser(void)(795065, 0x6d5c3a43, 0x616c7461, 0x69625c62) + 87 bytes
      [36] MATLAB.exe:0x00401d2f(4194304, 0, 795065, 0x027551e0)
      [37] MATLAB.exe:0x00403e45(0x7ffdc000, 0x00cdffd4 "ìÿÍ", 0x771de4b6, 0x7ffdc000)
      [38] kernel32.dll:0x77104911(0x7ffdc000, 0x76e2f28a, 0, 0)
      [39] ntdll.dll:0x771de4b6(0x00403cc0 "jth8U@", 0x7ffdc000, 0, 0)
      [40] ntdll.dll:0x771de489(0x00403cc0 "jth8U@", 0x7ffdc000, 0, 48)
     
    Please follow these steps in reporting this problem to The MathWorks so
    that we have the best chance of correcting it:
     
      1. Send this crash report to segv@mathworks.com for automated analysis.
         For your convenience, this information has been recorded in:
           C:\Users\MARTIN\AppData\Local\Temp\matlab_crash_dump.5412
     
      2. Also, if the problem is reproducible, send the crash report to
         support@mathworks.com along with:
           - A specific list of steps that will reproduce the problem
           - Any M, MEX, MDL or other files required to reproduce the problem
           - Any error messages displayed to the command window
         A technical support engineer will contact you with further information.
     
    Thank you for your assistance.  Please save your workspace and restart
    MATLAB before continuing your work.
    Comme l'image est affichée j'ai essayé de continuer en cliquant sur le second bouton et il m'affiche le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ??? Undefined function or variable 'frame'.
     
    Error in ==> ContageCellules>contage at 78
        cornee1 = imfilter(frame,h);
     
    ??? Error while evaluating uicontrol Callback.

  10. #10
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Hum, ça craint (désolée pour le langage mais ça exprime bien mon sentiment)
    Une recherche sur "Attempt to free previously freed memory" sur le site de The Mathworks renvoie tout plein de choses...

    Une en particulier qui peut correspondre :
    Why does the Image Acquisition Toolbox 1.7 (R14SP1) crash when using 'grayscale' for the 'ReturnedColorSpace ...

    Je te laisse découvrir (vu apparemment tu es en version R14SP1...)

  11. #11
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bon ben me reste plus qu'a demander à mon prof la version supérieur.

    En tout cas merci beaucoup pour l'aide.

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour.

    Voila je n'ai pas réussit à mettre à jour (parce qu'il faut encore plus payer :s) mais j'ai réussit a contourner le problème tout simplement en passant l'image en niveau de gris plutôt que la vidéo.

    J'ai aussi fait quelques petites améliorations au niveau des fonctions, notamment rajouter un slider qui permet de jouer sur une constante utilisé pour le traitement de l'image. J'utilise aussi simulink pour le traitement de l'image (qui à besoin de la variable que l'on peut régler).

    Mais tout sa cause quelques problèmes.

    Tout d'abord le même problème que la dernière fois au sujet de l'endroit ou s'affiche les différentes images.
    La première image s'affiche bien dans le handles(6) mais si on clique une seconde fois sur le bouton au lieu de s'afficher dans le handles(6) à la place de la première elle prend toute la taille du GUI.
    La seconde image qu'on affiche grâce au second bouton elle ne s'affiche pas et donne le même message d'erreur que précédemment alors qu'elle devrais s'afficher dans le handles(7).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ??? Error using ==> imuitools\private\imageDisplayParseInputs
    Invalid input arguments.
     
    Error in ==> imshow at 144
      [cdata, cdatamapping, clim, map, xdata, ydata, ...
     
    Error in ==> ContageCellules2>contage at 109
        imshow(imagecornee,'Parent','hundles(7)');
     
    ??? Error while evaluating uicontrol Callback.
    Un autre problème vient de l'utilisation de simulink, en effet simulink utilise deux variables, 'num' et 'cornee1' qui sont défini uniquement dans la fonction, les mettre en global ne semble pas fonctionner avec simulink, il a donc fallut utiliser la fonction assignin pour les créer dans le workspace. Même si cela fonctionne ce n'est pas très élégant et je doute que cela fonctionne encore si j'essaye de faire un programme indépendant de matlab avec tout sa ensuite.

    Un dernier problème mineur est l'affichage de la variable num dans le handles(9) qui se fait avec 4 chiffre après la virgule, comment faire pour qu'il n'affiche pas les chiffre après la virgule?

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    function ContageCellules
    
    close all;
    clear all;
    
    % la variable frame est créer dans une des sous fonctions et utilisé dans
    % une deuxième sous fonction, je l'ai donc mis en global pour que cela
    % fonctionne.
    global frame
    
    % permet de créer la vidéo et afficher la preview
    vid = videoinput('winvideo', 2);
    set(vid, 'SelectedSourceName', 'input1');
    src_vid = getselectedsource(vid);
    preview(vid); 
    
    % les différents éléments de l'interface graphique sont numéroté de 1 à 9.
    handles(1)=figure('position',[100 100 1000 700],...
        'Toolbar','none',...
        'Menubar','none',...
        'NumberTitle','Off',...
        'Name','Video avec comptage de cellule'); 
    
    handles(2)=uicontrol('Style', 'pushbutton',... 
                         'String', 'Photo',...
                         'Units','normalized',...
                         'Position', [0 0 0.15 0.07],...
                         'Callback', @prisephoto); 
    
    handles(3)=uicontrol('Style', 'pushbutton',... 
                         'String', 'Contage',...
                         'Units','normalized',...
                         'Position', [0.17 0 0.15 0.07],... 
                         'Callback', @contage);
    
    handles(4)=uicontrol('Style', 'pushbutton',...
                         'String','Close',...
                         'Units','normalized',...
                         'Position', [0.34 0 0.15 0.07],...
                         'Callback', @fermer);
    
    handles(5)=uicontrol('Style', 'text',... 
                         'String', '0',...
                         'Units','normalized',...
                         'Position', [0.85 -0.04 0.15 0.08],...
                         'tag','résultat');
    
    handles(9)=uicontrol('Style','Edit',...
                         'String','125',...
                         'Units','normalized',...
                         'Position',[0.75 0.09 0.07 0.03],...
                         'CallBack', @EditCallBack,...
                         'HorizontalAlignment','left');
                     
    handles(8)=uicontrol('Style', 'Slider','String', 'Reglage contrast',...
                         'Units', 'normalized',...
                         'Position', [0.55 0.05 0.45 0.03],...
                         'Callback', @SliderCallBack,...
                         'Value', 125,...
                         'Min',1,'Max',256);
                     
    
                     
    handles(6)=subplot('Position', [0.54 0.2 0.45 0.65]);
    
    handles(7)=subplot('Position', [0.04 0.2 0.45 0.65]);
    
    % la variable 'num' est créer puis créer dans le workspace pour être
    % disponible pour simulink, est-il possible de le rendre disponible pour
    % simulink sans devoir la créer dans le workspace?
    num = 125;
    assignin('base','num',num);
    
        % La sous-fonction permettant de prendre la photo et de la passer en
        % niveau de gris puis de l'afficher dans le handles(6) quand on clique
        % sur le bouton. Le problème c'est que si l'on clique une seconde fois
        % l'image s'affiche sur toute la fenêtre faisant disparaitre les boutons
        % au lieu de remplacer la première image dans le handles(6).
        function prisephoto(varargin)
        
        frame = getsnapshot(vid);
        frame = rgb2gray(frame);
        imshow(frame);
        
        end
    
        % La sous-fonction permettant de convertir la photo en image en noir et
        % blanc, d'abord avec un traitement du contraste puis avec l'application
        % simulink 'testcontage'. L'application 'testcontage' prend la photo
        % dans le workspace (qu'on a mis précédemment grâce à la fonction
        % assignin) et passe tous les pixel supérieur à la constant num
        % (réglable et elle aussi précédemment mis dans le workspace) en noir et
        % le reste en blanc (avec des valeur 0 et 1), puis compte le nombre
        % d'éléments blanc dont la taille dépasse un certain nombre de pixel.
        % Il en ressort 2 information (nombreobjets (out1) et imagecornee(out2)
        % qui doivent s'afficher dans les endroits prévu dans le GUI. Le nombre
        % d'élément s'affiche bien à l'endroit désiré mais la photo en noir et
        % blanc non.
        function contage(varargin)
        
        h = fspecial('unsharp');
        cornee1 = imfilter(frame,h);
        cornee1 = histeq (cornee1);
        cornee1 = medfilt2(cornee1,[3 3]);
        cornee1 = imadjust(cornee1);
        assignin('base','cornee1',cornee1);
        [t,x,nombreobjets,imagecornee]=sim('testcontage');
        set(handles(5),'string', num2str(nombreobjets));
        imshow(imagecornee,'Parent','hundles(7)');
        end
        
        % La fonction permettant de fermer l'interface et la preview.
        function fermer(varargin)
        
        close all;
        delete(vid);
        
        end
        % La fonction permettant d'afficher et de modifier la valeur de 'num' en la tapant.  
        function EditCallBack(varargin)
        
        num = str2num(get(handles(9),'String'));
           if length(num) == 1 & num <=256 & num >=1
             set(handles(8),'Value',num);
             assignin('base','num',num);
           else
             msgbox('La valeur doit etre comprise entre [1,256]','Error','error','modal');
           end  
        end
        
        % la fonction permettant de modifier la valeur de 'num' avec le slider.
        function SliderCallBack(varargin)
        
            num = get(handles(8), 'Value');
            set(handles(9), 'String', num2str(num));
            assignin('base','num',num);
        end
    
    end
    Merci d'avance.
    Images attachées Images attachées  

  13. #13
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imshow(imagecornee,'Parent','hundles(7)');
    Il y a 2 erreurs : 1 faute de frappe et le 3ème argument ne doit pas être un string mais un nombre.
    Essayes plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imshow(imagecornee,'Parent',handles(7));
    Désolée pas le temps de regarder le reste de ton code.

  14. #14
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Ah oui en effet, ça ces bête comme erreur, malheureusement même corrigé cela ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ??? Error using ==> imuitools\private\imageDisplayParseInputs
    Invalid input arguments.
     
    Error in ==> imshow at 144
      [cdata, cdatamapping, clim, map, xdata, ydata, ...
     
    Error in ==> ContageCellules2>contage at 109
        imshow(imagecornee,'Parent',handles(7));
     
    ??? Error while evaluating uicontrol Callback.
    Pas de problème pour le temps, je suis pas pressé.
    En tout cas merci d'être présente comme ça, j'ai même pas eu le temps d'éditer pour l'image de simulink que tu avais répondu.

  15. #15
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Pourrais-tu vérifier la valeur de handles(7) ?
    Si on regarde la doc apparemment cela ne retourne pas le handle de l'axe du subplot mais un vecteur contenant les handles de tous les subplot...
    Cela pourrait expliquer l'erreur.

    [EDIT]D'ailleurs pourquoi utilises-tu SUBPLOT et pas simplement la commande AXES ?

  16. #16
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Voilà, enfin un peu de temps pour me poser

    Citation Envoyé par Arwendil Voir le message
    Un autre problème vient de l'utilisation de simulink, en effet simulink utilise deux variables, 'num' et 'cornee1' qui sont défini uniquement dans la fonction, les mettre en global ne semble pas fonctionner avec simulink, il a donc fallut utiliser la fonction assignin pour les créer dans le workspace. Même si cela fonctionne ce n'est pas très élégant et je doute que cela fonctionne encore si j'essaye de faire un programme indépendant de matlab avec tout sa ensuite.
    Si c'est bien dans ce cas là assignin. Ou alors il faut passer par un fichier MAT que tu charges dans ton modèle Simulink avec le bloc...Form MAT-File (je crois).
    Pour ce qui est de faire un programme indépendant de MATLAB, je t'arrête tout de suite : avec Simulink c'est impossible (enfin en tout cas faire un ensemble GUI+Simulink...)

    Citation Envoyé par Arwendil Voir le message
    Un dernier problème mineur est l'affichage de la variable num dans le handles(9) qui se fait avec 4 chiffre après la virgule, comment faire pour qu'il n'affiche pas les chiffre après la virgule?
    Regarde du côté de la fonction SPRINTF elle te permettra de formater ton numérique comme tu le souhaites.

  17. #17
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour.

    Donc pour simulink je vais laisser comme ça.
    Pour la fonction SPRINTF cela fonctionne merci donc.

    Pour le chois de subplot plutôt que de axes c'est juste que c'est la première que j'ai trouvé dans l'aide donc j'ai utilisé sa mais sa fait exactement la même chose si je remplace par axes visiblement.

    Par contre j'ai essayer de changer tous les noms des différents boutons en des choses genre figure1 bouton1, bouton2, bouton3, image1 mais cela ne change rien j'ai toujours le même problème au niveau de l'affichage.

  18. #18
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    ça donne quoi :chez toi ?
    Quand tu dis :
    j'ai toujours le même problème au niveau de l'affichage.
    C'est que tu as toujours le même message d'erreur ?

    [EDIT]Peux-tu aussi rajouter cette ligne avant le imshow qui plante et regarder ce que ça donne :

  19. #19
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Alors quand je tape help imshow ça donne ça :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    IMSHOW Display image.  
        IMSHOW(I) displays the intensity image I.
     
        IMSHOW(I,[LOW HIGH]) displays I as a grayscale intensity image,
        specifying the display range for I. The value LOW (and any value less
        than LOW) displays as black, the value HIGH (and any value greater than
        HIGH) displays as white, and values in between display as intermediate
        shades of gray. IMSHOW uses the default number of gray levels. If you
        use an empty matrix ([]) for [LOW HIGH], IMSHOW uses [min(I(:))
        max(I(:))]; the minimum value in I displays as black, and the maximum
        value displays as white.
     
        IMSHOW(RGB) displays the truecolor image RGB.
     
        IMSHOW(BW) displays the binary image BW. Values of 0 display as black, and
        values of 1 display as white.
     
        IMSHOW(X,MAP) displays the indexed image X with the colormap MAP.
     
        IMSHOW(FILENAME) displays the image contained in the graphics file
        FILENAME.  The file must contain an image that can be read by IMREAD or
        DICOMREAD. IMSHOW calls IMREAD or DICOMREAD to read the image from the
        file, but the image data is not stored in the MATLAB workspace.  If the
        file contains multiple images, the first one will be displayed. The file
        must be in the current directory or on the MATLAB path.
     
        With no input arguments, IMSHOW displays a file chooser dialog so you
        can select an image file interactively.
     
        HIMAGE = IMSHOW(...) returns the handle to the image object created by
        IMSHOW.
     
        IMSHOW(...,PARAM1,VAL1,PARAM2,VAL2,...)  specifies parameters and
        corresponding values that control various aspects of the image display.
        Parameter names can be abbreviated, and case does not matter.
     
        Parameters include:
     
        'DisplayRange'           Two-element vector [LOW HIGH] that controls the
                                 display range of an intensity image. See above
                                 for more details about how to set [LOW HIGH].
     
                                 Including the parameter name is optional, except
                                 when the image is specified by a filename. 
                                 The syntax IMSHOW(I,[LOW HIGH]) is equivalent to
                                 IMSHOW(I,'DisplayRange',[LOW HIGH]).
                                 The parameter name must be specified when 
                                 using IMSHOW with a filename, as in the syntax
                                 IMSHOW(FILENAME,'DisplayRange'[LOW HIGH]).
     
        'InitialMagnification'   A numeric scalar value, or the text string 'fit',
                                 that specifies the initial magnification used to 
                                 display the image. When set to 100, the image is 
                                 displayed at 100% magnification. When set to 
                                 'fit' IMSHOW scales the entire image to fit in 
                                 the window.
     
                                 On initial display, the entire image is visible.
                                 If the magnification value would create an image 
                                 that is too large to display on the screen,  
                                 IMSHOW warns and displays the image at the 
                                 largest magnification that fits on the screen.
     
                                 By default, the initial magnification is set to
                                 the value returned by
                                 IPTGETPREF('ImshowInitialMagnification').
     
        'XData'                  Two-element vector that establishes a
                                 nondefault spatial coordinate system by
                                 specifying the image XData. The value can
                                 have more than 2 elements, but only the first
                                 and last elements are actually used.
     
        'YData'                  Two-element vector that establishes a
                                 nondefault spatial coordinate system by
                                 specifying the image YData. The value can
                                 have more than 2 elements, but only the first
                                 and last elements are actually used.
     
        Class Support
        -------------  
        A truecolor image can be uint8, uint16, double, or single. An indexed image
        can be logical, uint8, double, or single.  An intensity image can be
        logical, uint8, double, single, int16, or uint16. The input image must be
        nonsparse. 
     
        If your image is int16 or single, the CData in the resulting image
        object will be double. For all other classes, the CData matches the
        input image class.
     
        Related Toolbox Preferences
        ---------------------------  
        You can use the IPTSETPREF function to set several toolbox preferences that
        modify the behavior of IMSHOW:
     
        - 'ImshowBorder' controls whether IMSHOW displays the image with a border
          around it.
     
        - 'ImshowAxesVisible' controls whether IMSHOW displays the image with the
          axes box and tick labels.
     
        - 'ImshowInitialMagnification' controls the initial magnification for
          image display, unless you override it in a particular call by
          specifying IMSHOW(...,'InitialMagnification',INITIAL_MAG).
     
        For more information about these preferences, see the reference entry for
        IPTSETPREF.
     
        Remarks
        -------
        IMSHOW is the toolbox's fundamental image display function, optimizing 
        figure, axes, and image object property settings for image display. IMTOOL
        provides all the image display capabilities of IMSHOW but also provides 
        access to several other tools for navigating and exploring images, such as
        the Pixel Region tool, Image Information tool, and the Adjust Contrast 
        tool. IMTOOL presents an integrated environment for displaying images and
        performing some common image processing tasks.
     
        Examples
        --------
            % Display an image from a file
            imshow('board.tif') 
     
            % Display an indexed image
            [X,map] = imread('trees.tif');
            imshow(X,map) 
     
            % Display an intensity image 
            I = imread('cameraman.tif');
            imshow(I) 
     
            % Display an intensity image, adjust the diplay range
            h = imshow(I,[0 80]);
     
        See also imread, imtool, iptgetpref, iptsetpref, subimage, truesize,
                 warp, image, imagesc.
     
     
        Reference page in Help browser
           doc imshow
    j'avais déjà regardé dans l'aide mais, par contre il n'y a pas 'Parent' d'expliquer alors que dans l'aide sur le site de Matwork c'est expliqué.

    Quand je dis que j'ai exactement le même problème c'est que j'ai le même message d'erreur oui.

    J'ai ajouter la ligne et enlevé le paramètre dans la fonction imshow, le code donnant sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    get(handles(7),'type');
    imshow(imagecornee);
    J'ai aussi essayé en remplaçant Handles(7) par image2 dans la fonction la et pour le nom de l'axe.
    Malheureusement dans les deux cas cela s'affiche désormais sur toute la figure (puisqu'il n'y a plus le paramètre qui provoquait l'erreur dans la fonction imshow même) sans venir se mettre dans l'axes handles(7). Je n'ai donc plus de message d'erreur, mais get(handles(7),'type') ne semble pas pouvoir régler l'endroit ou se met l'image.

  20. #20
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    OK donc ce n'est pas directement possible dans ta version.
    Tu peux essayer comme ça (peut-être, désolée je ne peux tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hImage=imshow(imagecornee);
    set(hImage,'Parent',handles(7));

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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. [Débutant] [Edit] Afficher le résultat dans une zone de l'interface graphique
    Par jena dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 16/09/2011, 20h41
  3. Réponses: 5
    Dernier message: 15/09/2011, 22h53
  4. [XAML] afficher un screen d'une vidéo dans une ListView
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 22/09/2010, 11h37
  5. [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

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