Salvare immagine in rotazione

di il
19 risposte

Salvare immagine in rotazione

Buongiorno a tutti,

Sono alle prime armi su Matlab e navigando sul forum ho trovato un post simile a quello che mi serviva:
https://www.iprogrammatori.it/forum-programmazione/matlab-simulink/rotazione-automatica-cubo-t26058.html

Mi interessa però salvare la figura in rotazione mediante gif o video. Come è possibile farlo ?

19 Risposte

  • Re: Salvare immagine in rotazione

    Per creare una "gif", puoi usare la funzione "imwrite" come suggerito in:

    https://www.mathworks.com/help/matlab/ref/imwrite.html#btv452g-1

    oppure in

    https://www.mathworks.com/matlabcentral/answers/94495-how-can-i-create-animated-gif-images-in-matlab

    dove ci sono anche indicazioni per convertire una "gif" in un video.


    Per la creazione di un video puoi fare riferimento a

    https://www.mathworks.com/help/matlab/ref/videowriter.html
  • Re: Salvare immagine in rotazione

    Ok grazie per la risposta. Però non riesco a capire come applicare quello sui link a seguire dello script in basso (per ottenere in particolare una gif)

    % Creazione dei punti di esempio
    pt=randi([100,200],10,3);
    % Plot dei punti di esempio
    plot3(pt(:,1),pt(:,2),pt(:,3),'o','markerfacecolor','r','markeredgecolor','r')
    grid on
    box
    daspect([1 1 1])
    % Identificazione dei limiti degli assi
    x_lim=get(gca,'xlim')
    y_lim=get(gca,'ylim')
    z_lim=get(gca,'zlim')
    % Settaggio manuale dei "tick" degli assi
    set(gca,'xtick',[x_lim(1):25:x_lim(2)])
    set(gca,'ytick',[y_lim(1):25:y_lim(2)])
    set(gca,'ztick',[z_lim(1):25:z_lim(2)])
    % Modifica del valore di CameraViewAngle: più è grando il valore, più
    % l'oggetto rappresentato sembra "lontano" questo evita che MatLab aggiusti
    % automaticamente le dimensinoi del sistem di assi cartesiani
    set(gca,'CameraViewAngle',[15])
    % Loop per la rotazione del grafico
    for i=1:5:660
    view(i,33)
    pause(.3)
    end
  • Re: Salvare immagine in rotazione

    Partendo dalle istruzioni riportate in https://www.mathworks.com/help/matlab/ref/imwrite.html#btv452g-1 potresti scrivere una funzione per la creazione delle gif.
    Un esempio potrebbe essere:
    
    function create_gif(filename,fig,delay_time,write_mode)
    %
    % create_gif(filename,fig,delay_time,write_mode)
    % Input:
    %   filename: name of the gif file (incliding the ".gif" extension)
    %   fig: handle of the Figure from which to crete the gif (es. gcf for the current Figure)
    %   delay: time delay (in seconds) between two frames of the gif
    %   write_mode: 0 at the first call to initialize the gif
    %                       1 for all the other call
    %
    drawnow
    frame = getframe(fig);
    im = frame2im(frame);
    [A,map] = rgb2ind(im,256);
    if(write_mode == 0)
       imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',delay_time);
    else
       imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',delay_time);
    end
    
    Puoi chiamare la funzione (con write_mode=0) una prima volta prima del loop che genera il grafico e poi nel loop (con "write_mode=1) nel loop, dopo le istruzioni che modificano il grafico.

    I parametri di input sono descritti nel codice..
  • Re: Salvare immagine in rotazione

    Grazie, ma essendo alle prime armi non ho capito come applicarlo al caso riportato in alto
  • Re: Salvare immagine in rotazione

    Qualcuno che può aiutarmi ?
  • Re: Salvare immagine in rotazione

    Come indicato nella risposta precedente:
    Puoi chiamare la funzione (con write_mode=0) una prima volta prima del loop che genera il grafico e poi nel loop (con "write_mode=1) nel loop, dopo le istruzioni che modificano il grafico.
    In questo esempio viene creato un semplice grafico.
    Ci sono poi due loop:
    [*] il primo cambia il colore della curva con un intervallo di 0.5 secondi (inserito solo per far vedere quale sarà l'effetto nella gif e testare se l'intervallo è adeguato, ovviamente non è necessario per la creazione della gif)
    [*] il secondo effettua lo stesso cambio dio colore, ma invece di attendere 0.5 secondi tra un cambio e l'altro, crea una gif nella quale i frames si susseguono con un intervallo di 0.5 secondi (fai riferimento alla precedente risposta per la descrizione dei parametri di input della funzione che creala gif)
    
    l_col='rgbk'
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,l_col(i))
       pause(.5)
    end
    
    
    figure
    % Initialize the gif
    create_gif('prova_gig.gif',gcf,.5,0)
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,l_col(i))
       % Add frames to the gif
       create_gif('prova_gig.gif',gcf,.5,1)
    end
    
  • Re: Salvare immagine in rotazione

    ask_raf ha scritto:


    Come indicato nella risposta precedente:
    Puoi chiamare la funzione (con write_mode=0) una prima volta prima del loop che genera il grafico e poi nel loop (con "write_mode=1) nel loop, dopo le istruzioni che modificano il grafico.
    In questo esempio viene creato un semplice grafico.
    Ci sono poi due loop:
    [*] il primo cambia il colore della curva con un intervallo di 0.5 secondi (inserito solo per far vedere quale sarà l'effetto nella gif e testare se l'intervallo è adeguato, ovviamente non è necessario per la creazione della gif)
    [*] il secondo effettua lo stesso cambio dio colore, ma invece di attendere 0.5 secondi tra un cambio e l'altro, crea una gif nella quale i frames si susseguono con un intervallo di 0.5 secondi (fai riferimento alla precedente risposta per la descrizione dei parametri di input della funzione che creala gif)
    
    l_col='rgbk'
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,l_col(i))
       pause(.5)
    end
    
    
    figure
    % Initialize the gif
    create_gif('prova_gig.gif',gcf,.5,0)
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,l_col(i))
       % Add frames to the gif
       create_gif('prova_gig.gif',gcf,.5,1)
    end
    

    Inserendo questa parte, dopo il codice scritto all'inizio da me, mi porta ad un errore a questa riga: plot(sind(0:360),'linewidth',2,l_col(i))

    E non capisco se devo utilizzare solo questa parte di codice o devo anche inserire quella citata precedente ?
  • Re: Salvare immagine in rotazione

    Scusa, nel codice mancava la stringa "color" nelle chiamate alla funzione "plot".

    Questo è il codice aggiornato:
    
    l_col='rgbkc'
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,'color',l_col(i))
       pause(.5)
    end
    
    
    figure
    % Initialize the gif
    plot(sind(0:360),'linewidth',2,'color',l_col(i))
    create_gif('prova_gig.gif',gcf,.5,0)
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,'color',l_col(i))
       % Add frames to the gif
       create_gif('prova_gig.gif',gcf,.5,1)
    end
    
  • Re: Salvare immagine in rotazione

    ask_raf ha scritto:


    Scusa, nel codice mancava la stringa "color" nelle chiamate alla funzione "plot".

    Questo è il codice aggiornato:
    
    l_col='rgbkc'
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,'color',l_col(i))
       pause(.5)
    end
    
    
    figure
    % Initialize the gif
    plot(sind(0:360),'linewidth',2,'color',l_col(i))
    create_gif('prova_gig.gif',gcf,.5,0)
    
    for i=1:length(l_col)
       plot(sind(0:360),'linewidth',2,'color',l_col(i))
       % Add frames to the gif
       create_gif('prova_gig.gif',gcf,.5,1)
    end
    

    Con questa parte di codice aggiornata mi porta adesso un errore alla riga dove è presente il primo create_gif('prova_gig.gif',gcf,.5,0).
  • Re: Salvare immagine in rotazione

    Quale errore?

    Ho provato ad eseguire il codice aggiornato e non ottengo nessun errore.

    Questa è la gif che ottengo
    prova_gig.gif
    prova_gig.gif

  • Re: Salvare immagine in rotazione

    ask_raf ha scritto:


    Quale errore?

    Ho provato ad eseguire il codice aggiornato e non ottengo nessun errore.

    Questa è la gif che ottengo
    prova_gig.gif
    Sì questa la ottengo. Ma non genera la gif.
    Comunque la mia domanda rimane sempre la stessa ovvero nell'esempio che ho riportato all'inizio, come posso salvare quell'immagine in rotazione mediante gif o mini video ?
  • Re: Salvare immagine in rotazione

    Nel post precedente hai scritto:
    Con questa parte di codice aggiornata mi porta adesso un errore alla riga dove è presente il primo create_gif('prova_gig.gif',gcf,.5,0).
    Se non pubblichi il messaggio di errore, non ti si può aiutare.

    A meno di errori (che non hai chiarito), la funzione create_gif, chiamata prima del loop ed all'interno del loop, crea ("salva", se preferisci) il file "prova_gig.gif", nel caso specifico, nella quale si vedono i colori della curva cambiare.
  • Re: Salvare immagine in rotazione

    Questo è l'errore che mi compare:

    Undefined function 'create_gif' for input arguments of type 'matlab.ui.Figure'.

    Error in esempio_internet (line 65)
    create_gif('prova_gig.gif',gcf,.5,0)
  • Re: Salvare immagine in rotazione

    L'errore che hai riscontrato è dovuto al fatto che usi una versione di Matlab più recente della mia, assumo almeno R2016a o più recente.
    La funzione "create_gif" si basa sulle "finestre grafiche" di tipo Figure, mentre, in base al messaggio di errore, la tua è di tipo UiFigure (introdotto nella versione R2016a).

    Non avendo a disposizione la versione aggiornata di MatLab non posso verificare una soluzione, mi dispiace.
Devi accedere o registrarti per scrivere nel forum
19 risposte