Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

UFO動画を作る

 夜景の動画の空にUFOを追加します。動画ファイルを読み出して移動する楕円形を描画し再び動画として保存します。画像処理ライブラリOpenCVで動画ファイルを読み出し、フレーム毎の画像にcv2.ellipseで楕円形を描画し、その画像をつなぎ合わせてUFO動画にします。途中で楕円の動きを変化させUFOっぽくします。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.8.8
  • Pillow 8.2.0
  • OpenCV 4.0.1
準備

 動画ファイルはMixkitの "Fireworks in the beach"をダウンロードし320x180にリサイズしたうえでjupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’firework.mp4'で保存しました。このブログにはmp4ファイルが貼れないのでアニメーションgifファイルに変換したものを下に貼ります。

f:id:T_A_T:20220122143904g:plain
firework.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が追加された動画が保存されます。
f:id:T_A_T:20220122144101g:plain

以下のサイトを参考にさせていただきました

Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村