2016-07-03 22 views
1

Ich habe eine Datenbank mit (x, y) Punkten gesammelt im Laufe der Zeit auf einem Bild zu plotten. Für eine bessere Datenrepräsentation möchte ich Frames des Bildes plus einen Kreis auf den (x, y) Koordinaten erzeugen, wenn sie angezeigt werden sollen. Ich habe es mit dem folgenden Code geschafft, aber es dauert meiner Meinung nach zu viel Zeit (das Video ist 4250 Frames lang, und es muss mehrere Male gemacht werden, für separate Datensammlungen). Was ich suche, ist eine mögliche Optimierung der Verwendung des Bildes, das anfänglich im Speicher geladen wird, so dass es nicht für jedes Bild wieder geladen wird, sondern ein für allemal.pil python multiple Bild unabhängig zeichnen

subprocess.call(['mkdir', install_path + 'users/' + user.name + '/temp']) 
# creates a temporary folder for the pngs generated 
r = 8 

for i in range(0, 4250, 1): 
    valaro = Image.open('pngs/valaro_800.png') 
    draw = ImageDraw.Draw(valaro) 
    for d in data: 
     if (d.reeltime + 5) * 25 > i > (d.reeltime - 5) * 25: 
      # interpret the data to fit on the picture 
      xl = d.x * 2.91 + 392 
      yl = d.y * -3.06 + 434 

      draw.ellipse((xl - r, yl - r, xl + r, yl + r), fill='green') 
    valaro.save('users/' + user.name + '/temp/' + user.name + str(i) + '.png') 

Vielen Dank im Voraus für die Antworten

Antwort

0

Sie könnten ... ändern

for i in range(0, 4250, 1): 
    valaro = Image.open('pngs/valaro_800.png') 

... bis ...

original = Image.open('pngs/valaro_800.png') 
for i in range(0, 4250, 1): 
    valaro = original.copy() 

... so das Bild wird nur einmal geladen, aber ich vermute, dass dies nur einen geringen Leistungsgewinn bringen wird.

+0

Vielen Dank für Ihre Antwort, nur den Unterschied getestet: 31s gewonnen (2m 29sec vs 3m 1sec) auf einem i7 3630QM/16Go RAM. Eigentlich ist es nicht schlecht, aber ich weiß nicht, ob wir die Dinge mit der gleichen Konfiguration von Paketen und Sprache weiter vorantreiben könnten. – Xander

+0

@Xander Ich vermute, dass der Großteil der Zeit in der 'valaro.save()' Aufruf ausgegeben wird, wenn, wie Sie sagen, es 4,250 PNG-Dateien auf die Festplatte schreiben muss. Ich gehe davon aus, dass diese Dateien nur als temporäre Eingabe für ein anderes Tool verwendet werden, das eine Videodatei erstellt. Je nachdem, welches Format das Video haben muss, kann es einen besseren Ansatz geben. In jedem Fall erhalten Sie möglicherweise einen größeren Leistungsschub, wenn die temporären Dateien auf einer [RAM-Diskette] (https://en.wikipedia.org/wiki/RAM_drive) gespeichert wurden. – Aya

+0

Genau. Ich verwende ffmpeg mit Overlay-Filtern, um die gesammelten Daten in einem Diagramm darzustellen, das mit dem Originalvideo synchronisiert ist. Es gibt keine spezielle Notwendigkeit für das Videoformat, ich könnte PNG gekapselt in einem .MOV-Container machen, aber ein MOV/H.264 wird am Ende Speicherplatz sparen. Ich stelle mir vor, wir könnten alle PNG im RAM generieren und die MOV/PNG-Datei direkt generieren, dann in MOV/H.264 für platzsparende neu kodieren. Wenn Python und PIL mir solche Speichermanipulationen erlauben. – Xander