本記事では、動画をアニメチックに変換する雛形コードを載せました。動画の返還前後の動画は下記です。
■本プログラム
import os import cv2 from PIL import Image, ImageFont, ImageDraw import moviepy.editor as mp import numpy as np def movie2anime(input_file, out_file): # 動画とそのフレームワーク情報を取得 video = cv2.VideoCapture(input_file) width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) size = (width, height) num_of_frame = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) fps = int(video.get(cv2.CAP_PROP_FPS)) # 出力フォーマットの指定 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') writer = cv2.VideoWriter(out_file, fourcc, fps, (width, height)) # フレーム1枚ずつ処理する for i in range(num_of_frame): ret, frame = video.read() # 輪郭を抽出する処理 gray = cv2.cvtColor(frame, cv2.COLOR_BGRA2GRAY) edge = cv2.blur(gray, (3, 3)) # ぼかす edge = cv2.Canny(edge, 50, 150, apertureSize = 3) edge = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR) # RGBに戻す img2 = frame.copy() # 減色処理 img3 = np.array(img2 / scale, dtype = np.uint8) img4 = np.array(img3 * scale, dtype = np.uint8) # アニメ画像へ変換(差分を減算処理) anime = cv2.subtract(img4, edge) writer.write(anime) if i % 50 == 0: print(str(i) + "/" + str(num_of_frame)) # 後処理 writer.release() video.release() print("num_of_frame -> " + str(num_of_frame)) print("fps -> " + str(fps)) # 音声を動画に加える関数(編集した動画は一旦、音声がなくなるため) def extract_and_set_audio(input_video1, input_video2, out_file, out_audio): # オリジナル動画をメモリにクリップ clip_in = mp.VideoFileClip(input_video1).subclip() # オリジナル動画から音声ファイルを抽出して、ファイルに出力する clip_in.audio.write_audiofile(out_audio) # (音声を付与したい)動画をメモリにクリップする clip_out = mp.VideoFileClip(input_video2).subclip() # 音声を付与して、ファイルに出力する clip_out.write_videofile(out_file, audio = out_audio) if __name__ == '__main__': # 動画ファイルのパス input_video = '190719_213142.mp4' # 減色処理の度合い:値が大きい程にアニメ度が高くなる scale = 60 # 出力ファイル名 file_base_name = os.path.splitext(os.path.basename(input_video))[0] out_video1 = file_base_name + '_anime_' + str(scale) + '.mp4' out_audio = file_base_name + '_music.mp3' out_video2 = file_base_name + '_anime_' + str(scale) + '_finished.mp4' # オリジナル動画を元に、アニメ動画を作成する movie2anime(input_video, out_video1) # 作成したアニメ動画には音声がないため、音声を付与する input_video2 = out_video1 extract_and_set_audio(input_video, input_video2, out_video2, out_audio)
以上
<広告>
リンク