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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    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 confirmé
    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
    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
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    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 confirmé
    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
    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
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    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 confirmé
    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
    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.

+ 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. [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