2015-02-28 10 views
9

Używam animacji Matplotlib do produkcji animowanych postaci. Zauważyłem problem, który jest szczególnie zauważalny w przypadku animacji z dużą liczbą klatek, co oznacza, że ​​jakość figur bardzo szybko się pogarsza, co skutkuje pikselowo-niewyraźnie wyglądającym efektem.Pixelated animacje w Matplotlib

Przykłady:

Messy linie siatki Messy grid lines

wyjściowe piksele pixilated output

Byłem renderingu animacje wykorzystujące

import matplotlib 
matplotlib.use("Agg") 

anim = animation.FuncAnimation(fig, ..., blit=False) 
mywriter = animation.FFMpegWriter(fps=15) 
anim.save("path.mp4", writer=mywriter) 

Próbowałem używać blit = True/False, ale nie zauważyłem dużej różnicy.

Wersja Matplotlib: 1.4.2. System: Mac 10.10

+1

możliwy duplikat [matplotlib animowanego filmu: jakość filmu malejącą z czasem] (http://stackoverflow.com/questions/25203311/matplotlib-animation-movie-quality-of -movie-malejąco-z czasem) – YXD

+0

Jaki jest twój domyślny kodek w 'matplotlib.rcParams ['animation.codec']'? – aganders3

+0

@Mr E, prawdopodobnie duplikat. Zauważyłem, że 'anim.save ("path.mp4", writer = mywriter, codec = "libx264", bitrate = -1, extra_args = [' - pix_fmt ', "yuv420p'])" dało taki sam wynik. – osnoz

Odpowiedz

5

To właśnie dla mnie zadziałało.

Można zmienić bitrate podczas tworzenia instancji pisarz

import matplotlib.animation as animation 

anim = animation.FuncAnimation(fig, ...) 

FFMpegWriter = animation.writers['ffmpeg'] 
metadata = dict(title='Movie Test', artist='Matplotlib', 
       comment='Movie support!') 

# Change the video bitrate as you like and add some metadata. 
writer = FFMpegWriter(fps=15, bitrate=1000, metadata=metadata) 

Następnie można zapisać swój film.

anim.save("path.mp4", writer=mywriter) 

Nadzieja pomaga

+1

Dziękuję za rozwiązanie mrcl, wydaje się, że ręczne określanie szybkości transmisji działa. Dla każdego, kto zajmuje się tym problemem, jest tryb automatyczny (bitrate = -1), którego użycie powoduje bałaganowe zbuforowane symulacje, jeśli chcesz mieć niezły wynik określania szybkości transmisji ręcznie, odkryłem, że bitrate = 5000 wykonuje zadanie dla zostawiam całkiem ostry wynik. – osnoz