動画を鉛筆画風に変換する
動画を鉛筆画に変換します。画像処理ライブラリOpenCVの cv2.VideoCapture で動画ファイルを読み出し各フレームをcv2.pencilSketchで鉛筆画に変換し動画に保存します。1.5秒までは元動画、1.5秒~3秒はcv2.addWeightedで元動画から鉛筆画に徐々に変化させ、3秒以降を鉛筆画にしています。
環境
準備
動画ファイルはMixkitの 'Cute old couple in a park' をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名 ’couple.mp4' で保存しました(動画のフレームサイズは480x270)。このブログには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)
実行結果
鉛筆画に変換された動画が保存されます。
以下のサイトを参考にさせていただきました
Emotion Explorer > Python 鉛筆画風 PNGアニメーションを作成
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存