2017-08-23 4 views
0

je l'ai lu dans une vidéo Matlab comme ceci:Accélérer framerate pour la mise à jour figure dans Matlab

v = VideoReader('testvid.wmv') 

cnt = 0; 
while hasFrame(v) 
    cnt = cnt + 1; 
    video(cnt,:,:,:) = readFrame(v); 
end 

Si je vérifie l'objet vidéo, je me dit que la vidéo est avec 24 images. Toutefois, si montrerait directement après l'avoir lu (donc en gros imshow(readframe(v)) l'intérieur de la, il se montre uniquement en boucle avec environ 5 images par seconde.

Voilà pourquoi je l'ai écrit comme le code ci-dessus, de sorte que les cadres sont de pré-stockées dans l'espace de travail, et maintenant je peux les montrer comme

figure 
for i=1:cnt 
    tic 
    imshow(squeeze(video(i,:,:,:))) 
    toc 
end 

Cependant, je reçois encore que 10 cadres - est Matlab Limitied dans cette direction est-il une meilleure façon d'afficher une vidéo avec un assez rapide framerate à l'intérieur MATLAB?

+0

Il y a 24 images par "seconde", comme dans la vidéo jouera si rapidement joué dans un lecteur vidéo. Comme vous le savez, MATLAB n'est pas un lecteur vidéo, donc il va tracer des choses aussi vite que possible. Vous ne reproduisez pas réellement une vidéo, vous dites à MATLAB "d'afficher ces images une par une aussi vite que possible". Si vous avez un ordinateur puissant, il peut même les afficher plus vite que 24/s. –

+0

Une chose que vous pourriez faire serait de faire MATLAB ouvrir VLC pour lire votre fichier vidéo. voir la commande [system] (http://fr.mathworks.com/help/matlab/ref/system.html?refresh=true) si vous voulez faire cela – BillBokeey

Répondre

1

Vous pouvez mettre à jour votre intrigue CData plutôt th un replaçant à chaque fois.

% Prepare 24 fake RGB coloured frames 
A = randn(100,100,3,24); 

figure 

% Time the frame display time when replotting 
tic 
for k = 1 : 24 
    h = imshow(A(:,:,:,k)); 
    drawnow 
end 
t = toc; 
disp(t/24) 


% Time the frame display time when updating CData 
tic 
for k = 1 : 24 
    if k == 1 
     % Create the image object 
     h = imshow(A(:,:,:,k)); 
    else 
     % Update the Cdata property of image 
     set(h , 'cdata' , A(:,:,:,k)); 
    end 
    drawnow 
end 
t = toc; 
disp(t/24) 

Ma sortie est:

0.0854 

0.0093 

donc j'obtenir une amélioration de dix fois la mise à jour lors de CData. C'est en fait plus rapide que 24 images par seconde!