見出し画像

【杜陵高・定時制】タイムラプス撮影(杜陵高校DX化戦略#8)

杜陵高校DX化戦略の第8弾です。


こんにちは。杜陵高校3年次の宮田です。

現在、プログラム言語「python」を絶賛、勉強中です。
今回は、『タイムラプス撮影』するためのプログラムを開発しました。

★タイムラプスとは?
時間(time)と経過(lapse)を意味する単語で、撮影において同一アングルにて静止画を一定の時間間隔で撮って、その画像を時系列に並べて動画として再生する方法のことです。タイムラプスで撮影を行うと、飛び飛びに場面が早送りしているように見えます。イメージとしてはパラパラ漫画が近いものです。

★一定時間間隔撮影のプログラム製作
一定時間の経過ごとに、Webカメラから写真としてデータを保存するプログラムの作成です。
このプログラムの開発環境は、ノートPC+GoogleColaboratory+Webカメラです。(コード:抜粋)

while i < 120:
  i += 1
  filename = os.path.join('/content/画像フォルダ','photo'+str(i)+'.jpg')
  data = eval_js('takePhoto({})'.format(quality))
  binary = b64decode(data.split(',')[1])
  with open(filename, 'wb') as f:
      f.write(binary)
  time.sleep(5)

このプログラムでは、Webカメラからの画像取得は5秒おきに実行されます。回数カウンターiが120になったら終了です。これで、120枚の画像が取り込まれます。約10分の撮影です。取り込まれた画像データは、GoogleDriveへ保存するように設定されています。

★複数枚の画像(jpg)から動画(mp4)を作成するプログラム作成
(コード:抜粋)

jpg = cv2.imread(DIR + "/" + file_name + '1.jpg')
h, w, ch = jpg.shape
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('/content/タイムラプス' + file_name + '.mp4', fourcc, 30.0, (w,h))
for i in range(1, num_total_file + 1):
    jpg = cv2.imread(DIR + '/photo%d.jpg' % i)
    if jpg is None:
        print("cannot read images!")
        break
    out.write(jpg)


★実行結果
部屋の窓から空の雲を撮影した様子です。
完成した動画は、1秒間に30枚を再生する設定としましたので、約4秒の映像となります。
雲バージョン https://www.youtube.com/watch?v=O-dqKmtIM-M


屋外の撮影です。夜に道路を通過する車を意識して撮影しました。
車バージョン https://www.youtube.com/watch?v=aqTQJh_yaFs


★「タイムラプス撮影」プログラムの作成してみての感想・苦労した点
pythonでのプログラムだけでは完結できず、別のプログラミング言語javascriptを使ってデータのやり取りをするのは、今回が初めてでしたので、どの様な仕組みになっているのか理解するのにかなり時間がかかりました。
なぜ、このような仕組みにする必要があるかというと、クラウド上でプログラム開発をしているので、直接自身のPC環境にアクセスする権限(Webカメラの利用など)がないため、javascriptでその権限を取得して、そのデータをpythonに渡して処理を行うように工夫しました。ここはかなり苦労しましたが、さまざまな情報を収集して実現することができました。

display(Javascript('''
        (async function() {
            const div = document.createElement('div');
            const video = document.createElement('video');
            (中略)
          await video.play();
           google.colab.output.setIframeHeight
(document.documentElement.scrollHeight, true);
            setTimeout(function() {div.remove()},1000);
        })();
    '''))

さらに、「道路を走る車の動き」の撮影をする際には、クラウド上でプログラミングしているメリットを生かして、スマホで実行・撮影させることを考えました。しかし、スマホをWebカメラとして同期させて実行するのに少し手惑いました。「elgato camera Hub」というスマホアプリ(無料版)を使うことで画質は多少落ちますがWebカメラとして使えるようになりました。

今回のプロジェクトを通じて、Webカメラを使ったデータ取得や処理に関する知識がかなり深まりました。今後はさらに多様なデバイスとの連携や、リアルタイムデータ処理に挑戦していきたいと考えています。この経験を活かし、引き続きいろいろなことに挑戦していきたいです。