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 couleurfile_id =
VideoWriter(file_name,'format')
Création d'un objet vidéo :
On ouvre ensuite celui-ci avec
open(file_id)
, on écrit dedans avecwriteVideo...
(voir ci-après) et on le referme avecclose(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 champframe.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 égalementtourner 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 fonctionsavifile
/VideoWriter
etaddframe
/writeVideo
présentéesdans 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/Octaveset(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 utiledans 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"