ESP32 PSRAM Timer Camera X
前回、ESP32 PSRAM Timer Camera Xで撮影した画像を定期的に取得するためのPythonプログラムを作成しました。
今回はこのシリーズの最後として、撮影した画像からタイムラプス動画を作成していきましょう。
その際に、活躍するのがPythonの画像処理用ライブラリ PIL(Python Image Library)です。
それでは始めていきましょう。
PILを使ったアニメーションGIF
PILでアニメーションGIFを作成する大まかな流れとしては、
- 一つ一つの画像を「順番に」PILで読み込み、リストに格納
- 画像を格納したリストからアニメーションを作成し、保存
という流れになります。
全体のプログラムとしてはこんな感じです。
from PIL import Image
import os
pic_dir = r"./pic/"
pic_list = sorted(os.listdir(pic_dir))
img_list = []
for file in pic_list:
if file[-4:] == ".png":
img = Image.open(f"{pic_dir}{file}")
img_list.append(img)
img_list[0].save("animation.gif", save_all=True, append_images=img_list[1:], duration=50, loop=0)
今回、使用しているライブラリはPILとosの2つのみです。
from PIL import Image
import os
まず最初に重要なことが、画像を「順番に」読み込むことです。
画像をPILに読み込ませる際、その画像のパス(もちろんファイル名込み)が必要になります。
そこで「os.listdir()」でフォルダ内のファイル名を取得するのですが、ファイルの順番がランダムとなってしまいます。
そのため、今回はsorted()を使用し、ファイル名のリストの順番を整えています。
pic_dir = r"./pic/"
pic_list = sorted(os.listdir(pic_dir))
そして次に順番にPILで読み込み、リストimg_listに格納しています。
img_list = []
for file in pic_list:
if file[-4:] == ".png":
img = Image.open(f"{pic_dir}{file}")
img_list.append(img)
最後にPILの「.save()」を使って、アニメーションとして保存しています。
img_list[0].save("animation.gif", save_all=True, append_images=img_list[1:], duration=50, loop=0)
PIL自体は画像のライブラリなので、「img_list[0]」というリストimg_listの最初の画像を保存するというコマンドとなっています。
そして「save_all=True」のオプションにより、画像ではなく動画として保存することを指定しています。
(ちなみに「save_all=False」にすると一番最初の画像だけ保存されます)
また動画を使用するための画像ファイルを読み込むオプションとして「append_images」があり、こちらで2枚目以降、つまりimg_list[1:]と指定します。
すると最初の画像に対して、append_imagesで指定した画像を追加したアニメーションGIFが作成されます。
もし「append_images=img_list」とした場合は、最初の画像が2回使われてしまうので注意です。
PILの.save()のオプション
先ほどまででとりあえず画像を作成することができますが、PILの「.save()」の中でよくいじるだろうオプション2つに関していじってみましょう。
今回、準備した画像は20分間隔でまる1日取得した68枚の写真です。
本当ならば3枚x24時間で72枚なのですが、たまにサーバー側で取得できなかったようで、少し枚数が減っています。
サイズは撮影時は1280 x 1024ピクセルで撮影したのですが、ファイルサイズが大きくなりすぎたため、640 x 512に縮小しています。
一つ目は「duration」です。
こちらは画像が切り替わる速度を指定するオプションです。
例えば、「duration=100」とするとこんな感じです。
また「duration=100」とするとこのように遅くなります。
アニメーションを作成する画像の枚数が少ない場合は、ある程度ゆっくりに、多い場合は速くするなどの調整に使用します。
もう一つは「loop」です。
これは作成した動画を繰り返す回数を指定するオプションです。
つまり「loop=1」であれば1回、「loop=2」であれば2回繰り返されます。
ただし「loop=0」にすると繰り返し無しではなく、無限に繰り返されます。
ちなみに先ほどの2つの動画は「loop=0」にしているため、無限に繰り返されています。
例えば「loop=3」の場合はこんな感じです、と言いたいところですが、このページが表示されてすぐに動画が開始されてしまうことから、ここまで読み進めていただいている間に3回繰り返されて止まっていることでしょう。
これで当初の目標だったESP32 Timer Camera Xを使用したタイムラプス動画の作成ができました。
また色々とタイムラプス動画を作成したら、アップしていきたいなと思います。
次回からはまたDjangoに戻って、新しいアプリケーションの作成を進めていきましょう。
ではでは今回はこんな感じで。
コメント