2016-07-03 13 views
1

私は、(x、y)点を集めたデータベースを作成し、画像上にプロットします。より良いデータ表現のために、画像のフレームと、(x、y)座標上の円を表示する必要があります。私は次のコードでこれを行うことができましたが、私の意見では時間がかかりすぎました(ビデオは4250フレームで、別々のデータ収集のために何度も実行する必要があります)。私が探しているのは、最初にメモリに読み込まれたImageの使用方法を最適化することです。そのため、すべてのフレームで一度だけ読み込まれるわけではありません。回答を事前にpil python multiple画像に依存しない描画

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') 

おかげ

答えて

0

あなたはに... ...

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

を変更することができます...

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

...そう画像一度だけロードされますが、これはマイナーなパフォーマンス向上をもたらすと思われます。

+0

i7 3630QM/16Gio RAMで31秒(2m 29秒vs. 3m 1秒)の差がテストされました。実際には悪くはありませんが、パッケージや言語の設定が同じであれば、私はkownしません。 – Xander

+0

@ Xanderあなたが言っているように、4,250個のPNGファイルをディスクに書き込まなければならない場合、バルカン・セーブ()の呼び出しで大部分の時間が費やされていると思われます。これらのファイルは、ビデオファイルを作成する別のツールの一時的な入力として使用されていると推測します。動画のフォーマットに応じて、より良いアプローチがあるかもしれません。いずれにしても、一時ファイルが[RAMディスク](https://en.wikipedia.org/wiki/RAM_drive)に格納されていると、パフォーマンスが大幅に向上する可能性があります。 – Aya

+0

正確に。私はオーバーレイフィルタを備えたffmpegを使って元のビデオに同期したダイアグラム上に集められたデータを提示します。ビデオフォーマットは特に必要はありません.PNGを.MOVコンテナにカプセル化することもできますが、MOV/H.264は最後にスペースを節約します。私は、RAM内のすべてのPNGを生成し、直接MOV/PNGファイルを生成し、次にMOV/H.264でスペースを節約するために再エンコードすることができると思います。もしPythonとPILが私にそのようなメモリ操作をさせることができれば。 – Xander

関連する問題