2011-12-21 11 views
6

Intento crear una película haciendo un bucle a través de marcos en MATLAB.Problemas con la creación de archivos de película en MATLAB

Al consultar la documentación de mathworks.com en http://www.mathworks.com/help/techdoc/ref/movie.html, he logrado animar una trama. Sin embargo, surgen problemas cuando intento guardar la película en un archivo avi.

Tanto el avifile como VideoWriter métodos de https://stackoverflow.com/a/8038540/818608, produjeron los mismos errores.

Aunque la animación funciona bien, la película guardada consiste en un solo cuadro fijo y, a veces, la captura de pantalla incluye una superposición de mi navegador web de fondo.

Gracias de antemano.

A continuación se muestra el código que utilicé, y el marco que está congelado en el avi se vincula a continuación.

Z = peaks; surf(Z); 
axis tight 
set(gca,'nextplot','replacechildren'); 

vid = VideoWriter('myPeaks2.avi'); 
vid.Quality = 100; 
vid.FrameRate = 15; 
open(vid); 
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z) 
    writeVideo(vid, getframe(gcf)); 
end 
close(vid); 

winopen('myPeaks2.avi') 

The frame that's frozen on the avi is linked below

+2

¿Puede darnos un fragmento del código que está utilizando para construir la película, o mejor aún, un pequeño ejemplo de trabajo? ¿Qué error estás obteniendo en particular? –

+0

He actualizado mi publicación para incluir el código utilizado. La animación se ejecuta a través del ciclo 'for' y veo todos los cuadros. Sin embargo, cuando abro el avi guardado, solo veo un fotograma fijo todo el tiempo, y he incluido una captura de pantalla del fotograma anterior. – flamearchon

Respuesta

3

intente lo siguiente:

f = figure(); 
    Z = peaks; surf(Z); 
    a = axes('Parent',f); 
    axis(a,'tight'); 
    set(a,'nextplot','replacechildren'); 
    vid = VideoWriter('myPeaks2.avi'); 
    vid.Quality = 100; 
    vid.FrameRate = 15; 
    open(vid); 
    for k = 1:20 
     surf(a,sin(2*pi*k/20)*Z,Z) 
     writeVideo(vid, getframe(f)); 
    end 
    close(vid); 

    winopen('myPeaks2.avi') 

Contiene asas explícitos utilizando en lugar de implícita. Muchos caos son causados ​​en Matlab porque la gente tiende a usar los implícitos, como "gcf", "gca", que debería haberse eliminado por completo del idioma, en mi humilde opinión.

+2

Cuando ejecuto su código, no veo un diagrama. La figura está vacía. – flamearchon

3

Esto funciona perfectamente para mí.

¿Qué pasaría si intentara poner un drawnow en el circuito después del surf? (Esto borra todos los eventos y actualiza su figura gráfica).

¿Podría ser quizás su reproductor de películas o códecs? ¿Podría probar VLC/Windows Media Player/etc, etc.?

0

me las arreglé para conseguir que funcione al forzar los marcos figura para ser invisible, como por http://www.mathworks.com/support/tech-notes/1200/1204.html:

aviobj=avifile('test.avi'); %creates AVI file, test.avi 
hf= figure('visible','off'); %turns visibility of figure off 
hax=axes; 

for k=1:10 
    image(k.*peaks,'parent',hax); %puts image in invisible axes 
    set(gca,'Zlim',[-20 20]); 
    aviobj=addframe(aviobj,hf); %adds frames to the AVI file 
end 

aviobj=close(aviobj); %closes the AVI file 
close(hf); %closes the handle to invisible figure 

Al final del día, se utilizó sin compresión, ya que no tengo Indeo5 . ¿Es correcto decir que podemos descartar la compresión como el problema?

8

Tuve este (bueno, un problema muy relacionado) hoy. Este tema de stackoverflow fue uno de los mejores resultados del motor de búsqueda, así que pensé en proporcionar a los buscadores futuros más información.

Estaba usando un objeto VideoWriter y llamé al frame=getframe(fig_handle) para guardar cada fotograma en el video. Al igual que en la pregunta sobre este tema, solo se guardó 1 fotograma. Además, el fondo detrás de la figura se podía ver a través de él, como si la figura fuera parcialmente transparente.

Cambiando los renders a pintores o zbuffer funcionó. (set(gcf,'renderer','zbuffer') por ejemplo)

Necesitaba renderización de OpenGL, ya que la película usa transparencia. La clave para hacer este trabajo era utilizar

opengl('software') 

Este eludido lo que probablemente fue un problema con el envío de los gráficos desde y hacia la tarjeta de vídeo (no sé a ciencia cierta ... funcionó, y se trasladó en).

+2

+1 acaba de toparse con esto hoy en mi instalación de Win8. Esto no ocurrió en mi vieja máquina WinXP (estaba tratando de crear un archivo [GIF animado] (http://stackoverflow.com/a/11054155/97160) usando 'getframe' en un bucle). Otra solución es usar la [copia impresa] 'incoherente' (http://stackoverflow.com/a/13078532/97160) – Amro

+3

Esta debería ser la respuesta aceptada. Para resumir, en [@ respuesta de Andrey] (http://stackoverflow.com/a/8619687/866007), reemplace 'f = figure();' con 'f = figure ('renderer', 'zbuffer');' . –

0

¿Ha intentado cambiar la configuración de su monitor al color de 16 bits? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – NAZIK

+0

El enlace es solo para mostrar que la solución (cambiar la configuración de su monitor a color de 16 bits) ha demostrado funcionar en el pasado y ha sido documentada en matlabcentral durante varios años y también recientemente. – user2145660

0

También tuve el problema de que solo se almacenaba un cuadro hoy. Cambio de la velocidad de fotogramas a partir de:

vid.FrameRate = round(0.2*fps/beatfreq); 

que evaluó a 3, simplemente:

vid.FrameRate = 10; 

No puedo ver por qué esto haría ninguna diferencia, pero no funcionaba con prontitud después de cambiar esto.

EDITAR: Resulta que fue VLC que no puede manejar muy bajas velocidades de cuadros. Windows Media Player jugó bien sin problemas.

Cuestiones relacionadas