行ったり来たりする動画を作る
途中で行ったり来たりする動画を作ります。動画の特定区間で逆再生-順再生を繰り返します。画像処理ライブラリOpenCVで動画ファイルを読み出し、全フレームを画像としていったん保存します。その画像をつなぎ合わせて行ったり来たりする動画を作ります。
環境
準備
動画ファイルは動画ACの「サッカーでs字の練習する男の子」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’1636_640x360.mov'で保存しました(動画のサイズは640x360)。このブログにはmovファイルが貼れないのでアニメーションgifファイルに変換したもの。容量の制限があるためサイズを320x180に変換しています。
コード
①最終フレームから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)
実行結果
行ったり来たりする動画が保存されます。
以下のサイトを参考にさせていただきました
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存