Pythonでいろいろやってみる

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

行ったり来たりする動画を作る

 途中で行ったり来たりする動画を作ります。動画の特定区間で逆再生-順再生を繰り返します。画像処理ライブラリOpenCVで動画ファイルを読み出し、全フレームを画像としていったん保存します。その画像をつなぎ合わせて行ったり来たりする動画を作ります。

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

 動画ファイルは動画ACの「サッカーでs字の練習する男の子」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’1636_640x360.mov'で保存しました(動画のサイズは640x360)。このブログにはmovファイルが貼れないのでアニメーションgifファイルに変換したもの。容量の制限があるためサイズを320x180に変換しています。

f:id:T_A_T:20220121193837g:plain
1636_640x360.mov(320x180にリサイズしアニメーションgifに変換したもの)

コード

①最終フレームから100フレーム前まで普通に再生②最終フレームから100フレーム前に来たところで25フレーム逆再生し25フレーム順再生。これを3回繰り返す。③最終フレームまで普通に再生、として行ったり来たりする動画にしてmp4ファイルとgifアニメーションで保存します。なお保存する動画のフレームサイズはもとの640x360を縦横半分の320x180にしています。

from PIL import Image
import cv2

# gifファイル作成用イメージリスト
images =[]  

# 動画ファイル作成用イメージリスト
frames =[]  

# 動画ファイルのキャプチャー
cap = cv2.VideoCapture('1636_640x360.mov')

# フレームの幅取得
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('back_and_forth.mp4', fourcc, fps, (int(width/2), int(height/2))) 

# 動画を1コマずつ取り込んで処理
while(cap.isOpened()): 
    ret, frame = cap.read() # キャプチャー画像の取り込み
    
    if ret==True: # キャプチャー画像がある場合
        
        # 縦横半分にリサイズ
        resize = cv2.resize(frame, (int(width/2), int(height/2)))
        
        # リストに追加
        frames.append(resize)        
        
    else: # キャプチャー画像がない場合はループ終了 
        break
        
cap.release() # 再生画像をクローズ

p1 = allframes-100 # 折り返すフレーム
p2 = allframes-125 # 折り返すフレーム

for i in range(p1):
    out.write(frames[i])
    # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加
    matrix_pil = Image.fromarray(cv2.cvtColor(frames[i], cv2.COLOR_BGR2RGB))
    images.append(matrix_pil)
    
for j in range(3):    
    for i in range(p1, p2, -1):
        out.write(frames[i])
        # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加
        matrix_pil = Image.fromarray(cv2.cvtColor(frames[i], cv2.COLOR_BGR2RGB))
        images.append(matrix_pil)
        
    for i in range(p2, p1):
        out.write(frames[i])
        # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加
        matrix_pil = Image.fromarray(cv2.cvtColor(frames[i], cv2.COLOR_BGR2RGB))
        images.append(matrix_pil)
    
for i in range(p1, allframes):
    out.write(frames[i])
    # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加
    im = Image.fromarray(cv2.cvtColor(frames[i], cv2.COLOR_BGR2RGB))
    images.append(im)
    
    
out.release() # 出力動画ファイルをクローズ

# gif動画保存
images[0].save('back_and_forth.gif', save_all=True, append_images=images[1:], 
               optimize=False, duration=1000/fps, loop=0)   
実行結果

行ったり来たりする動画が保存されます。
f:id:T_A_T:20220121194542g:plain

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

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

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

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