UFO動画を作る
夜景の動画の空にUFOを追加します。動画ファイルを読み出して移動する楕円形を描画し再び動画として保存します。画像処理ライブラリOpenCVで動画ファイルを読み出し、フレーム毎の画像にcv2.ellipseで楕円形を描画し、その画像をつなぎ合わせてUFO動画にします。途中で楕円の動きを変化させUFOっぽくします。
環境
準備
動画ファイルはMixkitの "Fireworks in the beach"をダウンロードし320x180にリサイズしたうえでjupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’firework.mp4'で保存しました。このブログにはmp4ファイルが貼れないのでアニメーションgifファイルに変換したものを下に貼ります。
コード
①最終フレームから100フレーム前まで普通に再生
②最終フレームから100フレーム前に来たところで25フレーム逆再生し25フレーム順再生。これを3回繰り返す
③最終フレームまで普通に再生
として行ったり来たりする動画にしてmp4ファイルとgifアニメーションで保存します。なお保存する動画のフレームサイズは元の640x360を縦横半分の320x180にしています。
from PIL import Image import cv2 # gifファイル作成用イメージリスト images =[] # 動画ファイル作成用イメージリスト frames =[] # 動画ファイルのキャプチャー cap = cv2.VideoCapture('firework.mp4') # フレームの幅取得 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # フレームの高さ取得 height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 総フレーム数取得 allframes = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 動画ファイルのフレームレート取得 fps = cap.get(cv2.CAP_PROP_FPS) # 保存用動画ファイルのフォーマット設定 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('ufo.mp4', fourcc, fps, (int(width), int(height))) # 楕円の初期値 x = 180 # x座標 y = -10 # y座標 dx = 0.6 # x座標の変化量 dy = 0.5 # y座標の変化量 a = 3 # 楕円のx方向半径 b = 0.6 # 楕円のy方向半径 mag = 1 # 楕円の拡大率 dmag = 0.008 # 楕円の拡大率の変化量 # 動画を1コマずつ取り込んで処理 while(cap.isOpened()): ret, frame = cap.read() # キャプチャー画像の取り込み if ret==True: # キャプチャー画像がある場合 # 画像に楕円を描画 cv2.ellipse(frame, (int(x), int(y)), (int(a*mag), int(b*mag)), 0, 0, 360 ,(55, 255, 255), -1, cv2.LINE_AA) # VideoWriterにフレームを追加 out.write(frame) # gifファイル作成用イメージリストにフレームを追加 images.append(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) # 現在時間を取得 time = cap.get(cv2.CAP_PROP_POS_MSEC) # 5000msec以降は楕円の移動方向・距離と拡大率を変更 if time > 5000: dx = 4 dy = -0.3 dmag = -0.015 # 楕円のx,y座標の変更、拡大率の変更 x += dx y += dy mag += dmag else: # キャプチャー画像がない場合はループ終了 break cap.release() # 再生画像をクローズ out.release() # 出力動画ファイルをクローズ # gif動画保存 images[0].save('ufo.gif', save_all=True, append_images=images[1:], optimize=False, duration=1000/fps, loop=0)
実行結果
UFOが追加された動画が保存されます。
以下のサイトを参考にさせていただきました
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存