Pythonでいろいろやってみる

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

動画にタイムコードを入れる

 動画ファイルを読み出し、動画の右下にタイムコードを入れて保存します。スタートを 00秒:00フレーム として現在の秒とフレームを表示します。

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

 動画ファイルは動画ACの「ゆったり進む船」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’211_640x360.mov'で保存しました(動画のサイズは640x360)。このブログにはmovファイルが貼れないのでアニメーションgifファイルに変換したものを、また容量の制限があるため15秒の動画の冒頭4秒を下に貼ります。

f:id:T_A_T:20220117195349g:plain
211_640x360.mov(アニメーションgifに変換したもの冒頭4秒)

コード

 get(cv2.CAP_PROP_POS_MSEC)で現在の時間(msec)、cap.get(cv2.CAP_PROP_POS_FRAMES)で現在のフレームを取得しタイムコードを生成、putTextでフレームの右下にタイムコードを描いて、mp4ファイルとgifアニメーションで保存します。
なお保存する動画のフレームサイズはもとの640x360を縦横半分の320x180にしています。

from PIL import Image
import cv2

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

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

# 動画ファイルのフレームレート取得
fps = cap.get(cv2.CAP_PROP_FPS)

# 保存用動画ファイルのフォーマット設定
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 
out = cv2.VideoWriter('timecode.mp4', fourcc, fps, (320, 180)) 

# 動画を1コマずつ取り込んで処理
while(cap.isOpened()): 
    ret, frame = cap.read() # キャプチャー画像の取り込み
    
    if ret==True: # キャプチャー画像がある場合
        # 現在時間を取得
        time = cap.get(cv2.CAP_PROP_POS_MSEC)
        
        # 現在のフレーム数を取得
        frame_n = cap.get(cv2.CAP_PROP_POS_FRAMES)
        
        # タイムコードを作成
        timecode = str(int(time//1000)).zfill(2)+':'+str(int(frame_n%fps)).zfill(2)
        
        # 縦横半分にリサイズ
        resize = cv2.resize(frame, (320, 180))
        
        # タイムコードを動画に追加
        cv2.putText(resize, timecode, (260, 170), cv2.FONT_HERSHEY_SIMPLEX, 
                    0.5, (0, 0, 255), lineType=cv2.LINE_AA)

        # mp4動画を保存
        out.write(resize)        
        
        # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加
        matrix_pil = Image.fromarray(cv2.cvtColor(resize, cv2.COLOR_BGR2RGB))
        images.append(matrix_pil)
        
    else: # キャプチャー画像がない場合はループ終了 
        break
        
cap.release() # 再生画像をクローズ
out.release() # 出力動画ファイルをクローズ

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

赤い文字でタイムコードが入った動画が保存されます。
f:id:T_A_T:20220117195802g:plain

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

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

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

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