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

MATLAB Discussion :

Récupérer la valeur de X et Y du réticule de Matlab


Sujet :

MATLAB

  1. #1
    Invité
    Invité(e)
    Par défaut Récupérer la valeur de X et Y du réticule de Matlab
    Bonjour à tous,
    je cherche une fonction ou alors des idées de code pour récupérer la valeur que renvoie le réticule de l'interface de graphe (X et Y).
    Mon objectif étant d'afficher en temps réel les valeurs prises par le réticule dans un graphe juste à coté du principal.
    Merci d'avance pour toute idée ou pistes

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Utilise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> getCursorInfo(datacursormode(gcf))
    ans = 
           Target: 174.005615234375
         Position: [0.126986816293506 0.546881519204984 0.957166948242946]
        DataIndex: 3
    Position est ce que tu recherches.

    Il te reste à gérer le "temps réel" avec des callbacks.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci ERCO503.
    J'avoue que pour le temps réel j'ai vraiment aucune idée de comment faire.
    Pck pour le moment je fais un simple plot() des points qui m'intéresse mais c'est statique...le dynamique est beaucoup plus complexe

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Pour le temps réel, il faudrait avoir plus de détails sur ce que tu cherches à faire.

    Personnellement, je saurais sûrement comment faire, mais pas dans les règles de l'art.

  5. #5
    Invité
    Invité(e)
    Par défaut
    En fait je voudrais avoir un réticule de la forme de celui de la fonction ginput().
    et ensuite je voudrais qu'en même temps que je me déplace sur mon image deux graphes s'ouvrent et m'affichent le graphe des points de la ligne visée et l'autre les points de la colonne.
    Et pour compliquer le tout je souhaite faire ça en temps réel quand l'utilisateur déplace la souris...
    Donc pas trés évident
    Pour récupérer la valeur de mes colonnes et lignes je comptais me servir des coordonnées de la souris et extraire une sous-matrice pour les lignes et une pour les colonnes.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Bon, comme je disais, je doute que ce soit la façon de faire dans les règles de l'art, mais c'est fonctionnel.

    Note : J'utilise imread et imshow pour cet exemple, qui font partie du Image Processing Toolbox.

    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
    function XYtrace
     
    figure('Position', [100, 400, 600, 400],...
        'Name', 'Image',...
        'NumberTitle', 'off',...
        'Pointer','fullcross',...
        'WindowButtonMotionFcn',@tracing);
    I = imread('liftingbody.png');
    imshow(I);
    axesimg = gca;
     
    figure('Position', [800, 550, 600, 400],...
        'Name', 'X trace',...
        'NumberTitle', 'off');
    axesx = axes();
    figure('Position', [800, 50, 600, 400],...
        'Name', 'Y trace',...
        'NumberTitle', 'off');
    axesy = axes();
     
    x = zeros(size(I,2),1);
    y = zeros(size(I,1),1);
     
    px = plot(axesx,x);
    py = plot(axesy,y);
     
        function tracing(~,~,~)
            pt = ceil(get(axesimg,'CurrentPoint'));
            if pt(1,1) >= 1 && pt(1,2) >= 1 && pt(1,1) <= size(I,2) && pt(1,2) <= size(I,1)
                x = I(pt(1,2),:);
                y = I(:,pt(1,1));
                set(px,'YData',x);
                set(py,'YData',y);
            end
        end
     
    end

  7. #7
    Invité
    Invité(e)
    Par défaut
    Alors là un gros MERCI
    Par contre comme je suis un peu débutant et que je cherche à comprendre, tu peux m'expliquer la fin du programme ? pck j'ai un peu de mal.
    Etape par étape que je comprenne bien le code.
    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
    x = zeros(size(I,2),1);
    y = zeros(size(I,1),1);
    
    px = plot(axesx,x);
    py = plot(axesy,y);
    
        function trace(~,~,~) ??
            pt = ceil(get(axesimg,'CurrentPoint')); Pourquoi faire un arrondi ?
            if pt(1,1) >= 1 && pt(1,2) >= 1 && pt(1,1) <= size(I,2) && pt(1,2) <= size(I,1)
                x = I(pt(1,2),:);
                y = I(:,pt(1,1));
                set(px,'YData',x); pas XData plutôt ?
                set(py,'YData',y);
            end
        end
    
    end

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bon après avoir pas mal cherché j'ai commenté le code donc si tu peux me dire si je me suis pas trop trompé
    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
    function reticule_matlab
    %% création de la fenêtre principal
    figure('Position', [0, 300, 600, 400],...  % Position de la fenêtre.
        'Name', 'Acquisition',...  % Nom de la fenêtre.
        'NumberTitle', 'off',...  % Non affichage 'figure X'.
        'Pointer','fullcross',... % Choix du réticule.
        'WindowButtonMotionFcn',@trace); %WindowButtonMotionFcn permet de récupérer la position de la souris.
     
    %% Ouverture et affichage de la photo.
    I = imread('noir_et_blanc.png');
    imshow(I);
    axesimg = gca;
     
    %% Création de la fenêtre pour afficher le tracer de X.
    figure('Position', [650, 550, 600, 400],...
        'Name', 'X(ligne)',...
        'NumberTitle', 'off');
    axesx = axes();
     
    %% Création de la fenêtre pour afficher le tracer de y.
    figure('Position', [650, 50, 600, 400],...
        'Name', 'Y(colonne)',...
        'NumberTitle', 'off');
    axesy = axes();
     
    %% Création d'une matrice de zéro pour la hauteur et pour la largeur de l'image.
    x = zeros(size(I,2),1); % on récupère la taille en largeur de l'image avec size(I,2)
    y = zeros(size(I,1),1);% on récupère la taille en hauteur de l'image avec size(I,1)
     
    %% Affichage des graphes dimensionner à la taille de l'image.
    px = plot(axesx,x); 
    py = plot(axesy,y);
     
    %% Fonction de tracer.
        function trace(~,~,~)
            pt = ceil(get(axesimg,'CurrentPoint')); %Arrondi au positif sup axesming et position souris(CurrentPoint).
            % pt est une variable qui nous permet de localiser la souris par
            % rapport à l'axe de l'image.
     
            % On mais a jour le tracer que si on ce trouve sur l'image:
            if pt(1,1) >= 1 && pt(1,2) >= 1 && pt(1,1) <= size(I,2) && pt(1,2) <= size(I,1) 
                x = I(pt(1,2),:); % Extraction ligne des x pointée
                y = I(:,pt(1,1)); % Extraction colonne des y pointée
                set(px,'YData',x); % Mise à jour des paramètres graphique (point et axe)
                set(py,'YData',y); % Mise à jour les paramètres graphique (point et axe)
            end
        end
     
    end

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    En fait, il serait mieux d'utiliser round que mon choix initial de ceil (qui est un mauvais choix que j'avais fait trop rapidement). La propriété CurrentPoint fournit des données qui peuvent être décimales, d'où l'arrondi.

    NB : CurrentPoint est une propriété des axes. Je peux l'utiliser de cette façon pour une image, mais il faut faire attention à bien comprendre sa définition (puisque cette fonction ne renvoie pas le point sous la souris, mais plutôt le vecteur traversant les axes à l'endroit de la souris). http://www.mathworks.com/help/matlab...l#CurrentPoint

    Aussi, pour ton interrogation au sujet des (~,~,~) après tracing, j'en ai mis un de trop (seulement tracing(~,~) est nécessaire). C'est parce que les callback nécessitent en entrée deux arguments : function myCallback(src,eventdata), mais je ne les utilise pas. Plus de détails ici : http://www.mathworks.com/help/matlab...callbacks.html

    Pour ce qui est de YData, c'est la mise à jour des données Y du plot. Comme tu le sais, la forme la plus simple de cette fonction est plot(Y) où seront affichées en ordonnée les données Y et l'abscisse sera une simple numérotation. C'est notre cas d'utilisation, ce pourquoi on utilise YData. C'est peut-être mélangeant puisque j'ai nommé la variable x comme étant celle qui contient les données d'une rangée ("X Trace"). Il y a uniquement les points qui sont mis à jour, px et py servent à identifier lequel des plot qui doit être mis à jour avec ces données.

    Tu peux aussi ajouter ces validations pour éviter les erreurs à la fermeture des figures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ishandle(px)
        set(px,'YData',x);
    end
    if ishandle(py)
        set(py,'YData',y);
    end

  10. #10
    Invité
    Invité(e)
    Par défaut
    Un gros merci pour les explications, je viens juste de tout lire
    J'avais fait un travail de recherche et j'avais comprit le code mais tes explications confirme un peu tout ce que j'ai appris
    Merci pour ton temps et ta patience.

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

Discussions similaires

  1. DBGrid récupérer les valeurs de l'enregistrement courant
    Par bob_sapp dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/09/2014, 07h56
  2. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45
  3. Réponses: 2
    Dernier message: 03/06/2004, 08h32
  4. [Couleur] Récupérer les valeurs R,V,B et L,U,V ?
    Par M4v3rick dans le forum C++Builder
    Réponses: 4
    Dernier message: 25/01/2004, 03h28
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28

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