Précédent   Forum des professionnels en informatique > Environnements de développement > MATLAB > Images
Images Forum d'entraide sur le traitement d'images en MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 16h49   #1
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
Par défaut Extraire des images d'un film

Bonjour,
Je suis débutante sur MATLAB. Je souhaite créer un film à partir d’un autre film en ne prenant qu’une image sur deux. Je dois donc extraire x images du film : frame n , frame n+2,frame n+4, …,lastframe pour créer un nouveau fichier avi avec 2 fois moins d’images.
Pour cela j’ai fait :
Code :
1
2
3
4
avi1=mmreader(‘filename.avi’) ;%donne le nombre d’image, le format, la vitesse(fps)
Numbframes=avi1.NumberofFrames ; %donne le nombre d’images
firstFrame=read(avi1,1)
lastFrame=read(avi1,inf) ;
J’ai pensé à une boucle « for » mais avec les images je n’y arrive pas . Pouvez vous m’aider ? Avez-vous des astuces ?
merci
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 17h01   #2
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 3 598
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2009
Messages : 3 598
Points : 6 824
Points : 6 824
Bonjour,

Citation:
Envoyé par NINAJUL Voir le message
J’ai pensé à une boucle « for » mais avec les images je n’y arrive pas.
Une boucle for est un bon moyen... Qu'est-ce qui te bloque?
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
Je suis régulièrement sur le chat DVP - Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 18h01   #3
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
Est il possible de commencer par :
Code :
1
2
3
4
for k= firstframe:length(lastframe)
im(k)=firstname:k+x:lastframe
end
frames={avi(im).cdata}
désolée je crois que je suis trés mauvaise...
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 18h38   #4
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
Bonjour,

je te conseil de regarder dans: doc mmreaderIl te suffira dans ton cas de remplacer :
Code :
1
2
3
% Preallocate movie structure.
mov(1:Numbframes) = ...
Par
Code :
1
2
3
% Preallocate movie structure.
mov(1:ceil(Numbframes/2)) = ...
et
Code :
1
2
3
4
5
%Read one frame at a time.
for k = 1 : Numbframes
    mov(k).cdata = read(avi1, k);
end
par
Code :
1
2
3
4
5
%Read one frame at a time.
for k = 1 : 2: Numbframes
    mov(ceil(k/2)).cdata = read(avi1, k);
end
sauf erreur, ça doit être bon.

Si tu n'y arrives pas, je te donne le code entier.
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 12h02   #5
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
Gakusei merci beaucoup pour ton aide, voici mon programme:
clear all
close all
clc

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
%info sur le fichier avi affiché
filmavi1 = mmreader('test1.avi', 'Tag', 'My reader object');
get(filmavi1)

%%info sur un film en format avi%%
 filmavi1=mmreader('test1.avi');
   nFrames = filmavi1.NumberOfFrames;
 vidHeight = filmavi1.Height;
 vidWidth = filmavi1.Width;
 % Preallocate movie structure.
 mov(1:ceil(nFrames/2))= struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),'colormap', []);
 
 % lire 1 image à la fois.
for k = 1 : nFrames
    mov(ceil(k/2)).cdata = read(filmavi1, k);
                      
end

% taille de la figure.
hf = figure;
set(hf, 'position', [150 150 vidWidth vidHeight])

 % montre le film 1fois àla vitesse de la video.
movie(hf, mov, 1, 20);
je veux maintenant enregistrer un film avec moins d'image, je veux utiliser mov2avi

Code :
1
2
F(k)=getframe
movie2avi(F, 'test1modif.avi', 'compression', 'None','fps',15)
le problème c'est que je n'arrive pas à avoir le film qui s'enregistre (j'ai un carré blanc) et j'ai le même nombre d'images.
pouvez vous m'aider.
merci
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h12   #6
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 3 598
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2009
Messages : 3 598
Points : 6 824
Points : 6 824
Citation:
Envoyé par NINAJUL Voir le message
Code :
1
2
F(k)=getframe
movie2avi(F, 'test1modif.avi', 'compression', 'None','fps',15)
le problème c'est que je n'arrive pas à avoir le film qui s'enregistre (j'ai un carré blanc) et j'ai le même nombre d'images.
De quel film "qui s'enregistre" parles-tu?
As-tu jeté un coup d’œil aux fonctions
Code :
1
2
doc getframe
doc movie2avi
pour voir comment elles pouvaient fonctionner ensemble?

Pour utiliser GETFRAME, il te faudra afficher quelque chose à chaque itération de ta boucle...
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
Je suis régulièrement sur le chat DVP - Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 12h16   #7
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
Si tu veux enregistrer une image sur deux il faut que tu remplace :

Citation:
Envoyé par NINAJUL Voir le message
Code :
1
2
3
4
5
 % lire 1 image à la fois.
for k = 1 : nFrames
    mov(ceil(k/2)).cdata = read(filmavi1, k);
                      
end
par ce que j'ai mis:

Citation:
Envoyé par Gakusei Voir le message
Code :
1
2
3
for k = 1 : 2 : Numbframes
    mov(ceil(k/2)).cdata = read(avi1, k);
end
Ah en fait je viens de remarquer que j'avais fait une erreur de copier/coller la dernière fois . Il ne faut pas oublier le 2 en en-tête de la boucle for.
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 13h55   #8
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
ça y est je crois que j'y suis arrivée, merci winjerome et Gakusei pour votre aide!!
voici mon script final
Code :
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
clear all
close all
clc

%info sur le fichier avi affiché
filmavi1 = mmreader('test1.avi', 'Tag', 'My reader object');
get(filmavi1)

%%info sur un film en format avi%%
 filmavi1=mmreader('test1.avi');
   nFrames = filmavi1.NumberOfFrames;
 vidHeight = filmavi1.Height;
 vidWidth = filmavi1.Width;
 % Preallocate movie structure.
 mov(1:ceil(nFrames/2))= struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),'colormap', []);
 
 % boucle pour supprimer une image sur 2.
for k = 1 :2: nFrames
    mov(ceil(k/2)).cdata = read(filmavi1, k);
                       
end

% taille de la figure.
hf = figure;
set(hf, 'position', [150 150 vidWidth vidHeight])
 
% montre le film 1fois àla vitesse 20fps.
movie(hf, mov, 1, 20);
%création et sauvegarde du film à 15fps
movie2avi(mov, 'test1modif.avi', 'compression', 'None','fps',15)
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h22   #9
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
j'ai modifié légèrement mon script,

Code :
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
clear all
close all
clc
%création d'un nouveau fichier avi

%info sur le fichier avi affiché
filmavi1 = mmreader('test.mpg', 'Tag', 'My reader object');
get(filmavi1)

%%info sur un film en format mpg%%
 filmavi1=mmreader(‘test.mpg');
   nFrames = filmavi1.NumberOfFrames;
 vidHeight = filmavi1.Height;
 vidWidth = filmavi1.Width;
 % Preallocate movie structure.
 
 mov(1:ceil(nFrames/2))= struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),...
           'colormap', []);
 
 % lire 1 image à la fois.
j=1;
for k = 1:nFrames
    mov(j).cdata = read(filmavi1, k);
           j=j+1;
          
end

% taille de la figure.
hf = figure;
set(hf, 'position', [150 150 vidWidth vidHeight])

% montre le film 1fois àla vitesse de la video.
movie(hf, mov, 1, 20);

movie2avi(mov,'test2modif.avi','compression', 'indeo5','fps',50)
mais je bataille depuis quelques jours car je n'arrives pas à faire marcher ce programme pour des films avec un grand nombre d'images (2000 et plus)

j'ai une erreur ligne :
Code :
mov(j).cdata = read(filmavi1, k);
et il dit:
Code :
Matlab:read:readtimedout
c'est parce que j'ai un trop grand nombre d'images?
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 17h13   #10
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
Il y a un problème d'allocation pour l'objet mov:
Si tu veux lire l'image entière (pas une image sur 2) il te faut allouer mov de cette manière:
Code :
1
2
3
mov(1:nFrames)= struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),...
           'colormap', []);
Je ne suis pas sûr que l'erreur viennent de là


Remarque:
ta variable j ne te sert à rien ici. Tu peux remplacer mov(j).cdata par mov(k).cdata.

si tu as une version très récente de matlab (2010b) : VideoReader au lieu de mmreader
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 17h28   #11
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
j'ai essayé avec VideoReader mais je bloque au même endroit , je cherche toujours à réduire le nombre d'image d'un film j'obtiens l'erreur suivante.

Code :
1
2
3
4
5
6
7
??? MATLAB:read:readTimedOut

Error in ==> VideoReader.read at 79
        videoFrames = read(getImpl(obj), index);

Error in ==> reduction_film at 23
    mov(j).cdata = read(filmavi1, k);
merci gakusei pour ton aide
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 18h46   #12
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
Personellement je n'ai pas ce problème avec des vidéo longues.
Est-ce que tu as bien vérifié que ta vidéo n'était pas corrompu avec un média player?
Si il stop pendant la lecture le problème peut venir de là.

Un même genre d'erreur :http://www.mathworks.fr/support/solu...ution=1-9NYJWS
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 09h32   #13
Invité de passage
 
Femme
technicien chimiste
Inscription : février 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : technicien chimiste
Secteur : Industrie

Informations forums :
Inscription : février 2012
Messages : 7
Points : 0
Points : 0
merci pour ton aide, en fait il sagit d'un ' que j'ai changé en et lorsque je fais 'il me donne . matlab sous windows ne reconnait pas les j'ai un logiciel gratuit pour changer en mais il fait une compression que matlab ne reconnait pas et Matlab me met qu'il y a un problème de violation et se coupe .
NINAJUL est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h39.


 
 
 
 
Partenaires

Hébergement Web