Pythonでいろいろやってみる

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

動画を鉛筆画風に変換する

 動画を鉛筆画に変換します。画像処理ライブラリOpenCVの cv2.VideoCapture で動画ファイルを読み出し各フレームをcv2.pencilSketchで鉛筆画に変換し動画に保存します。1.5秒までは元動画、1.5秒~3秒はcv2.addWeightedで元動画から鉛筆画に徐々に変化させ、3秒以降を鉛筆画にしています。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 6.4.6
  • Python 3.8.12
  • Pillow 9.0.0
  • OpenCV 4.5.5
準備

動画ファイルはMixkitの 'Cute old couple in a park' をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名 ’couple.mp4' で保存しました(動画のフレームサイズは480x270)。このブログにはmp4ファイルが貼れないのでアニメーションgifファイルに変換したものを下に貼ります。

f:id:T_A_T:20220207201630g:plain
couple.mp4(gifファイルに変換したもの)

コード  
from PIL import Image
import cv2
import numpy as np

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

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

# 動画ファイルのキャプチャー
cap = cv2.VideoCapture('couple.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('pencil.mp4', fourcc, fps, (int(width), int(height))) 

# 動画を1コマずつ取り込んで処理
while(cap.isOpened()): 
    ret, frame = cap.read() # キャプチャー画像の取り込み
    
    if ret==True: # キャプチャー画像がある場合
        
        # 現在時間を取得
        time = cap.get(cv2.CAP_PROP_POS_MSEC)
                
        # 鉛筆画変換
        dst1, dst2 = cv2.pencilSketch(frame)
        
        # 1500msまでは元の画像
        if time<1500: 
            img = frame
            
        # 1500-3000msは元の画像と鉛筆画のブレンド        
        if time>=1500 and time<=3000: 
            alpha = 1-(time-1500)/1500
            beta = 1-alpha 
            img = cv2.addWeighted(frame, alpha, dst2, beta, 0)
            
        # 3000msからは鉛筆画        
        if time>3000: 
            img = dst2
               
        # VideoWriterにフレームを追加
        out.write(img)

        # gifファイル作成用イメージリストにフレームを追加
        images.append(Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)))

    else: # キャプチャー画像がない場合はループ終了 
        break
        
cap.release() # 再生画像をクローズ   
out.release() # 出力動画ファイルをクローズ

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

鉛筆画に変換された動画が保存されます。
f:id:T_A_T:20220207201830g:plain

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

Emotion Explorer > Python 鉛筆画風 PNGアニメーションを作成
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存

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

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