• Aucun résultat trouvé

b) frame = getframe(handle {,rect} )

Dans le document Cours MATLAB et GNU Octave en pdf (Page 98-103)

Capture l'image d'une figure sous forme raster (pixmap) : a) Récupère l'image de la figure courante

b) Permet de spécifier la figure par son handle, voire une portion de celle-ci définie par un rectangle rect de dimension [gauche

bas largeur hauteur] en pixels

L'objet frame résultant est une structure comportant 2 champs :

frame.cdata

: image proprement dite, tableau de dimension HxLx3 d'entiers non signés de type uint8 représentant les composantes RGB des pixels dans la plage 0 à 255

frame.colormap

: table de couleur

file_id =

VideoWriter(file_name,'format')

Création d'un objet vidéo :

On ouvre ensuite celui-ci avec

open(file_id)

, on écrit dedans avec

writeVideo...

(voir ci-après) et on le referme avec

close(file_id)

.

Pour voir les formats possibles, faire

VideoWriter.getProfiles

file_id =

avifile(file_name,'codec','format')

[O: video]

Ouverture d'un fichier vidéo :

Pour voir les formats possibles, faire

avifile('codecs')

[O: video]

writeVideo(file_id, frame)

Écriture dans fichier vidéo :

Insertion du frame dans le fichier vidéo file_id

addframe(file_id, image)

[O: video]

Écriture dans fichier vidéo :

Insertion de l'image dans le fichier vidéo file_id.

Si l'image provient d'un frame capturé avec

getframe...

, celle-ci se trouve dans le champ

frame.cdata

a) frame =

im2frame(image {,colormap} )

b) [image {,colormap} ] =

frame2im(frame)

Conversion image ↔ frame :

a) Conversion d'une image en un frame, en utilisant la table de couleur courante ou la colormap spécifiée b) et vice-versa

Voir aussi les fonctions de manipulation de fichiers images

imread

,

imwrite

,

imformats

,

imfinfo

image =

aviread(file_name, frame_no)

[O: video]

Extraction de frames dans in fichier vidéo :

Récupère, dans le fichier vidéo file_name, l'image correspondant au frame de numéro frame_no

{struct = }

aviinfo(file_name)

[O: video]

Attributs d'une vidéo :

Retourne les attributs du fichier vidéo file_name

Exemple

On présente ci-dessous 2 implémentations de la même animation, respectivement pour MATLAB ou Octave sous Windows, et pour Octave sous Linux.

Composée de 50 frames, l'animation se déroule à une cadence de 25 frames/secondes et dure donc 2 secondes. Elle représente la surface 3D correspondant à la fonction z=sin(x)*cos(y). On fait osciller l'amplitude/altitude de la surface (usage de

sin(2*pi*n/nb_frames)

) tout en faisant également

tourner l'observateur autour de la scène (usage de

view

).

Cliquer sur ce graphique pour voir l'animation !

Remarque: cette animation a été capturée avec le logiciel libre CamStudio, puis convertie avi->gif-animé (pour affichage dans navigateur web)

1. Implémentation pour MATLAB ou Octave sous Windows

Notez que le script ci-dessous présente du code conditionnel, selon que l'on tourne sous Octave ou sous MATLAB !

Remarque : sous Octave, il faut disposer de la version ≥ 4.4 (afin d'avoir la fonction

getframe

) et le package "video".

% Octave: chargement package "video" pour fonctions "avifile" et "addframe" if exist('OCTAVE_VERSION') % pour Octave

pkg load video end

% Creation/ouverture du fichier video, ouverture fenetre figure vide nom_video = 'animation.mp4';

if exist('OCTAVE_VERSION') % pour Octave

fich_video = avifile(nom_video,'codec','mpeg4'); % sous Windows else % pour MATLAB

fich_video = VideoWriter(nom_video,'MPEG-4'); open(fich_video)

end

fig=figure; % ouverture fenetre figure vide colormap(jet)

% Parametres du graphique

nb_frames=50; % nb frames animation x=0:0.2:2*pi; y=x; % plage de valeurs en X et Y [Xm,Ym]=meshgrid(x,y); % matrices grille X/Y

9/14/2018

MATLAB et Octave - 6. Graphiques, images, animations

https://enacit1.epfl.ch/cours_matlab/graphiques.shtml

45/46

fprintf('Frames # ') for n=1:nb_frames;

fprintf('%d ',n) % indicateur de progression: numero du frame) z=cos(Xm).*sin(Ym).*sin(2*pi*n/nb_frames);

surf(x,y,z) % affichage n-ième image

azimut=mod(45+(360*n/nb_frames),360); % azimut modulo 360 degres view(azimut, 30) % changement azimut vue

axis([0 2*pi 0 2*pi -1 1]) % cadrage axes axis('off')

img_frame = getframe(fig); % recuperation frame if exist('OCTAVE_VERSION') % pour Octave norm_frame = single(img_frame.cdata)/255 ;

% normalisation des valeurs: uint8 [0 à 255] -> real-single [0 à 1] addframe(fich_video, norm_frame); % insertion frame

else % pour MATLAB

writeVideo(fich_video, img_frame); % insertion frame end

end

% Fermeture fichier video et fenetre figure if exist('OCTAVE_VERSION') % pour Octave clear fich_video

else % pour MATLAB close(fich_video)

end close(fig)

fprintf('\nLa video est assemblee dans le fichier "%s" !\n', nom_video)

2. Implémentation pour Octave sous Linux

Voici une autre variante pour Linux dans laquelle on illustre, pour assembler les fichiers-images en une vidéo, l'utilisation de l'outil en mode-

commande

ffmpeg

. On n'a donc, dans ce cas, pas besoin des fonctions

avifile

/

VideoWriter

et

addframe

/

writeVideo

présentées

dans l'exemple précédent.

% Ouverture fenêtre figure vide

fig=figure; % ouverture fenêtre figure vide colormap(jet)

% Création sous-répertoire dans lequel on va enregistrer fichiers frames mkdir('frames');

% Paramètres du graphique

nb_frames=50; % nb frames animation x=0:0.2:2*pi; y=x; % plage de valeurs en X et Y [Xm,Ym]=meshgrid(x,y); % matrices grille X/Y

% Boucle de dessin des frames et sauvegarde sur disque fprintf('Frames # ')

for n=1:nb_frames;

fprintf('%d ',n) % indicateur de progression: numero du frame) z=cos(Xm).*sin(Ym).*sin(2*pi*n/nb_frames);

surf(x,y,z) % affichage n-ième image

azimut=mod(45+(360*n/nb_frames),360); % azimut modulo 360 degrés view(azimut, 30) % changement azimut vue

axis([0 2*pi 0 2*pi -1 1]) % cadrage axes axis('off')

print('-dpng','-r80',sprintf('frames/frame-%04d.png',n)) % sauvegarde frame sur fichier raster PNG, en résol. 80 dpi end

% Fermeture fenêtre figure close(fig)

% Assemblage de la vidéo (par outil Linux et non pas Octave)

disp(''); bidon=input('Frames generes ; frapper pour assembler la video'); system('ffmpeg -f image2 -i frames/frame-%04d.png -vcodec mpeg4 animation.mp4'); % sous Ubuntu nécessite package "ffmpeg"

% puis package "gstreamer0.10-ffmpeg" pour visualiser vidéo sous Totem disp('')

disp('La video est assemblee, le dossier ''frames'' peut etre detruit !')

6.7.3 Animations basées sur l'utilisation des "handles graphics"

Basée sur les "handles graphics", l'animations de graphiques est plus complexe à maîtriser, mais c'est aussi la plus polyvalente et la plus puissante. Elle consiste, une fois un objet graphique dessiné, à utiliser ses "handles" pour en modifier les propriétés (généralement les valeurs

'xdata'

et

'ydata'

...) avec la commande MATLAB/Octave

set(handle, 'property', value, ...)

. En redessinant l'objet après chaque modification de propriétés, on anime ainsi interactivement le graphique.

La fonction

rotate

(présentée plus haut), qui permet de faire tourner un objet graphique désigné par son handle, peut également être utile

dans le cadre d'animations.

6.7.4 Animations basées sur le changement des données de graphique ("refreshdata")

La technique ci-dessous s'appuie aussi sur les "handles graphics".

Fonction et description

Exemple Illustration

Cette fonction évalue les propriétés

'XDataSource'

,

'YDataSource'

et

'ZDataSource'

de la figure courante ou de l'objet spécifié par handle, et met à jour la figure si les données correspondantes ont changé

Ex

x_max = 10; nb_frames = 100; x_interv = x_max/nb_frames; x = 0:x_interv:x_max; y = sin(x);

plot(x, y, 'YDataSource', 'y'); axis([0 x_max -1 1]);

for k = 1:nb_frames pause(0.1)

y = sin(x + x_interv*k) * (nb_frames-k)/nb_frames ;

refreshdata

();

end

Cliquer sur ce graphique pour voir l'animation !

Remarque: cette animation a été capturée avec le logiciel libre CamStudio, puis convertie avi->gif-animé (pour affichage dans

navigateur web)

9/14/2018

MATLAB et Octave - 7. Programmation : interaction, structures de contrôle, scripts, fonctions, entrées-sorties, debu…

https://enacit1.epfl.ch/cours_matlab/mfiles.shtml#editeur_debugger

1/22

7. Programmation : interaction, structures de contrôle,

scripts, fonctions, entrées-sorties fichier, debugging

7.1 Généralités

Les "M-files" sont des fichiers au format texte (donc "lisibles") contenant des instructions MATLAB/Octave et portant l'extension *.m. On a vu la commande diary (au chapitre "Workspace") permettant d'enregistrer un "journal de session" qui, mis à part l'output des commandes, pourrait être considéré comme un M-file. Mais la manière la plus efficace de créer des M-files (c'est-à-dire "programmer" en langage MATLAB/Octave) consiste bien entendu à utiliser un éditeur de texte ou de programmation.

On distingue fondamentalement deux types de M-files : les scripts (ou programmes) et les fonctions. Les scripts travaillent dans le workspace, et toutes les variables créées/modifiées lors de l'exécution d'un script sont donc visibles dans le workspace et accessibles ensuite interactivement ou par d'autres scripts. Les fonctions, quant à elles, n'interagissent avec le workspace ou avec le script-appelant principalement via leurs "paramètres" d'entrée/sortie, les autres variables manipulées restant internes (locales) aux fonctions.

MATLAB/Octave est un langage interprété (comme les langages Perl, Python, Ruby, PHP, les shell Unix...), c'est-à-dire que les M-files (scripts ou fonctions) n'ont pas besoin d'être préalablement compilés avant d'être utilisés (comme c'est le cas des langage classiques C/C++, Java, Fortran...). A l'exécution, des fonctionnalités interactives de debugging et de profiling permettent d'identifier les bugs et optimiser le code.

MATLAB et Octave étant de véritables "progiciels", le langage MATLAB/Octave est de "haut niveau" et offre toutes les facilités classiques permettant de développer rapidement des applications interactives évoluées. Nous décrivons dans les chapitres qui suivent les principales possibilités de ce langage dans les domaines suivants :

interaction avec l'utilisateur (affichage dans la console, saisie au clavier, affichage de warnings/erreurs...) structures de contrôle (boucles, tests...)

élaboration de scripts et fonctions

entrées-sorties (gestion de fichiers, formatage...) debugging et profiling

7.2 Éditeurs

Les M-files étant des fichiers-texte, il est possible de les créer et les éditer avec n'importe quel éditeur de texte/programmation de votre choix. Idéalement, celui-ci devrait notamment offrir des fonctionnalités d'indentation automatique, de coloration syntaxique...

7.2.1 Commandes relatives à l'édition

Pour créer ou éditer un M-file depuis la fenêtre de commande MATLAB/Octave et basculer dans l'éditeur : edit M-file ou edit('M-file') ou open M-file ou open('M-file')

Bascule dans l'éditeur et ouvre le M-file spécifié. Si celui-ci n'existe pas, il est proposé de créer un fichier de ce nom (sauf sous MATLAB où open retourne une erreur).

Il est obligatoire de passer un nom de fichier à la commande open. S'agissant de edit, si l'on ne spécifie pas de M-file cela ouvre une fenêtre d'édition de fichier vide.

Sous MATLAB et sous Octave GUI, c'est l'éditeur intégré à ces IDE's qui est bien entendu utilisé. Si vous utilisez Octave-CLI (Octave en ligne de commande dans une fenêtre terminal), ce sera l'éditeur défini par la fonction EDITOR (voir plus bas).

Depuis les interfaces graphiques MATLAB et Octave GUI, on peut bien entendu aussi faire :

ouvrir un fichier existant : File > Open, bouton Open File , ou double-clic sur l'icône d'un M-file dans l'explorateur de fichiers intégré ( "Current folder" ou "File Browser")

créer un nouveau fichier : New > Script | Function, File > New > New Script | New Function ou bouton New Script

7.2.2 Éditeur/débugger intégré à MATLAB

Éditeur intégré de MATLAB R2014 (ici sous Windows) Quelques fonctionnalités pratiques de l'éditeur intégré de MATLAB :

Pour indenter à droite / désindenter à gauche un ensemble de ligne, sélectionnez-les et faites tab / maj-tab (ou Indent > Increase | Decrease) Pour commenter/décommenter un ensemble de lignes de code (c'est-à-dire ajouter/enlever devant celles-ci le caractère %), sélectionnez-les et faites ctrl-R / ctrl-T (ou Comment > Comment | Uncomment)

Concernant l'usage des boutons et raccourcis de debugging, voir le chapitre "Debugging"

7.2.3 Éditeurs pour GNU Octave

Dans le document Cours MATLAB et GNU Octave en pdf (Page 98-103)