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 :

PlotsFcns et getFrame


Sujet :

MATLAB

  1. #1
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut PlotsFcns et getFrame
    Hello

    je suis sur une optimisation (fmincon) dont le résultat est une surface
    j'ai modifier la PlotFcns optimplotx pour avoir un bel affichage pendant l'optimisation

    jusque là tout va bien
    après, comme mon optimisation dure longtemps, j'ai eu envie de l'enregistrer au format video pour la voir à posteriori ... et la ca coince
    mon code (avec en rouge mon enregistrement video) :
    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
    function stop = optimplotfmc(x,optimValues,state,varargin)
    
    persistent writerObj
    
    stop = false;
    switch state
        case 'init'
    
            set(gcf,'doublebuffer','on')
            
            writerObj = VideoWriter('optimfmc.avi');
            writerObj.FrameRate = 1;
            open(writerObj);
            
        case 'done'
            
            close(writerObj);
            
            
        case 'iter'
    %         % Reshape if x is a matrix
    %         x = x(:);
    %         xLength = length(x);
    %         xlabelText = sprintf('Number of variables: %g',xLength);
    
            vx = evalin('base','vEcartHbassin');
            vy = evalin('base','vAmplCycle');
            
            x = reshape(x,numel(vy),numel(vx));
            
            [vx,vy] = meshgrid(vx,vy);
            
            
    
            % Display up to the first 100 values
    %         if length(x) > 100
    %             x = x(1:100);
    %             xlabelText = {xlabelText,sprintf('Showing only the first 100 variables')};
    %         end
            
            if optimValues.iteration == 0
                % The 'iter' case is  called during the zeroth iteration,
                % but it now has values that were empty during the 'init' case
                %plotx = plot3(vx(:),vy(:),x(:),'bo');
                plotx = surf(vx,vy,x,'edgecolor','r','FaceAlpha',0.66);
                colormap winter
    
                view(3)
                grid on
                title(sprintf('Energie = %.2f GWh',- optimValues.fval/1000),'interp','none');
                zlabel(sprintf('Current point'),'interp','none');
                ylabel('amplitude marée','interp','none');
                xlabel('ecart bassin','interp','none');
    %             set(plotx,'edgecolor','none')
    %             set(gca,'xlim',[0,1 + xLength])
                set(plotx,'Tag','optimplotfmc');
            else
                plotx = findobj(get(gca,'Children'),'Tag','optimplotfmc');
                set(plotx,'Zdata',x);
                title(sprintf('Energie = %.2f GWh',- optimValues.fval/1000),'interp','none');
            end
            
            drawnow
            frame = getframe(gcf);
            writeVideo(writerObj,frame);
            
    end
    le problème c'est que ca me récupère des frames presque vide
    presque car j'ai un système d'axe quand même, mais 2D et pas du tout à l'échelle de ce que j'affiche (en fait c'est le système d'axe à la création de la figure plotFcns)

    en pieces jointes la figure que j'essaye de capturer et la video resultat

    une idée ??

    Merci
    Fab
    Images attachées Images attachées   

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    salut le fab,

    je ne suis pas bien habitué à faire ce genre de truc mais la seule fois où j'ai fais une vidéo j'ai procédé comme ceci :

    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
    aviobj1 = avifile('FOne.avi','fps',6,'quality',100)
     numframes1=length(F1(:,1));
    %A=moviein(numframes1); % create the movie matrix
     set(gca,'NextPlot','replacechildren')
     %axis equal
     i=0;
     for i=1:numframes1
    	plot_mesh(node,IEN,F1(i,:),1,MaxColorFv,MinColorFv);
        A(:,i)=getframe(gcf);
    	F=A(:,i);
    	aviobj1 = addframe(aviobj1,F);
     end
     %movie(A,10,3) % Play the MATLAB movie
    %save movie.mat A 
    aviobj1 = close(aviobj1);
    j'espère que ça pourra t'aider...

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    merci de ta réponse
    ta méthode est assez similaire à la mienne quant à la capture (getframe) sauf que tu utilise avifile au lieu de VideoWriter

    en fait mon problème est que le getframe ne prend pas ma fenetre en "photo" mais autre chose ... (je le vois bien en mode débug en regardant ce que retourne getframe : j'ai bien un soucis avec cette fonction et non avec VideoWriter)
    j'ai déjà fait des videos de plot animés sans soucis, (avec la même méthode que dans mon code ci dessus), mais là, j'ai l'impression d'avoir un problème lié au fait qu'il ne s'agisse pas d'une figure "standard" mais d'une PlotFcns

    Fabien

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    salut,

    ah OK... je ne peux donc pas t'aider dans ce cas je ne sais même pas ce que c'est "PlotFcns " mais d'après ce que tu dis il semblerai que se soit lié à cette fonction...

    bon courage

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    en fait les PlotFcns sont des fonctions d'affichage graphique "temps réel" d'une optimisation (fmincon, ...)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    super intéressant ça !
    faudrait que je jete un coup d'oeil un de ces quatres

  7. #7
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut Fabien,
    Je ne connaissais pas les PlotFcns, mais peut être que ceci t'aidera :
    tu as essayé de remplacer gcf par le handle que te renvoie le h=figure associée aux PlotFcns ?

  8. #8
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    en fait il n'y a pas de h=figure explicite dans la fonction
    j'ai essayé gca aussi, mais ca ne marche pas non plus
    et je ne pense pas que le problème vienne de là, car un print(gcf,'toto.jpg') fonctionne

    bon là en même temps je n'ai plus trop de consacré à ce problème, je verrai plus tard

  9. #9
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    je m'auto répond en citant une réponse de Jerome dans un autre post
    pas le temps de tester là maintenant mais c'est probablement ca, alors j'en garde ici une trace pour plus tard

    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    Je pense que le problème vient de la fonction getframe qui retourne toujours la première image. Ce problème est assez récurrent sous Windows.
    Voir ce thread.

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

Discussions similaires

  1. probleme getframe subplot
    Par j_ere_my dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/07/2009, 09h51
  2. getFrame problème pour dupliquer une frame
    Par nabilous dans le forum Général Java
    Réponses: 5
    Dernier message: 24/10/2008, 16h19
  3. aide pour getframe et movie2avi
    Par helaaa dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/04/2008, 10h39
  4. Problème avec getframe
    Par helaaa dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/03/2008, 09h59
  5. De Getframe à movie
    Par aerolupo dans le forum MATLAB
    Réponses: 11
    Dernier message: 04/02/2008, 16h57

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