プログラム処理した動画をPythonのOpenCVを使ってMP4形式にして保存する方法
プログラム処理した動画(pythonで加工した動画)をOpenCVを使ってMP4形式にして保存するPythonプログラムを紹介します。
今までの投稿で載せている動画はPowerPointの挿入から画面録画で撮った動画を載せていま
プログラム処理した動画(pythonで加工した動画) は過去に投稿した「コマ飛ばしで早送り風にした処理」、「顔にマスクを着ける(合成)処理」、「逆再生にする処理」などを使っています。
加工して使っている動画は「Pexels」さんの動画を使っています。
目次
・動画を保存する命令
・コマ飛ばしで早送り風にした処理をMP4形式で保存した動画とプログラム
・顔にマスクを着ける(合成)処理をMP4形式で保存した動画とプログラム
・逆再生にした処理をMP4形式で保存した動画とプログラム
・MP4形式の動画に保存をして良かった点
・参考サイト
動画を保存する命令
cv2.VideoWriter_fourcc(‘m’,’p’,’4′,’v’)
保存形式の指定
int(mv.get(cv2.CAP_PROP_FPS))
読み込んだ動画のFPS(フレームレート)を取得して整数にする
cv2.VideoWriter(‘保存する名前’,保存形式,フレームレート,サイズ)
動画を保存する形を作成
save.write(frame)
1フレーム(静止画像)を保存、これを繰り返すことで動画になります
save.release()
保存した動画ファイルを閉じる
コマ飛ばしで早送り風にした処理をMP4形式で保存した動画とプログラム
動画
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import cv2 mv= cv2.VideoCapture('production ID_車_主観2.mp4')#動画の読み込み frame_count =int(mv.get(cv2.CAP_PROP_FRAME_COUNT))#動画のフレームをすべて取得 size=(640,480)#サイズ指定 frame_rate = int(mv.get(cv2.CAP_PROP_FPS))#読み込んだ動画のFPS(フレームレート)を調べる fourcc = cv2.VideoWriter_fourcc('m','p','4','v')#保存形式 save = cv2.VideoWriter('pro_save_komatobasi.mp4',fourcc,frame_rate,size)#動画を保存するためのモデルを作成~こういう形で保存しますね、みたいなイメージ print("保存中...") for i in range(frame_count): for i in range(5):#5コマ飛ばしで読み込む ch,frame=mv.read() if ch==True:#正常に読み込めたら下の処理を実行 frame=cv2.resize(frame,(640,480))#上でsize=(640,480)で指定していますが、念のため save.write(frame)#保存 print("保存しました") save.release() # ファイルを閉じる cv2.destroyAllWindows()#ウインドウを閉じる |
このプログラムはこちら→「for文を使って動画をコマ飛ばしで表示、早送り風」の投稿で紹介したプログラムにMP4形式で保存するプログラムを追加しものです。
コマ飛ばしで早送り風の動画は5コマ飛ばしで表示しています。
顔にマスクを着ける(合成)処理をMP4形式で保存した動画とプログラム
動画
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import cv2 def mask_gousei(img,mask):#マスクを合成する自作関数 half=[] img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレイ画像 images = face_cascade.detectMultiScale(img_gray)#顔の検出 if len(images) != 0:#顔を検出できた場合 for x,y,w,h in images:#顔検出した座標の数繰り返す face=img[y:y+h,x:x+w]#顔切り取る face_gray=img_gray[y:y+h,x:x+w]#顔のグレイ画像 eye = eye_cascade.detectMultiScale(face_gray)#グレーにした顔から目を検出 if len(eye) != 0:#目を検出できた場合 half=img[y+h//2:y+h,x:x+w]#顔の下半分の画像を変数halfに入れる d1=y+h//2#人画像に合成したマスクを埋め込むときに使う d2=y+h d3=x d4=x+w else:#for文の繰り返しがすべて終わるまで、continue continue if len(half) != 0:#顔の検出と目の検出、両方ができた場合 height, width = half.shape[:2]#顔の下半分の高さ、幅を取り出す mask=cv2.resize(mask,(width,height))#顔の下半分とマスクの大きさを合わせる for x in range(height):#マスクの背景の色を取り除いて、顔の下半分にマスクを合成 for y in range(width): b, g, r = mask[x, y]#色を取り出す if (b >= 0 and b <= 160) and (g >= 0 and g <= 160) and (r >= 0 and r <= 160):#黒色背景を除く continue half[x, y]=mask[x, y]#合成 img[d1:d2,d3:d4]=half#人画像にマスクを合成した画像を埋め込む return img else:#顔は検出できたが、目を検出できなかった場合 読み込んだ画像をそのまま返す return img else:#顔を検出できなかった場合 読み込んだ画像をそのまま返す return img face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")#顔を検出するカスケードファイル eye_cascade = cv2.CascadeClassifier("haarcascade_eye.xml")#目を検出するカスケードファイル mv= cv2.VideoCapture('Pexels Videos 1608393.mp4')#動画の読み込み mask_img=cv2.imread("DSC_1210 (5).jpg")#マスク画像 frame_count =int(mv.get(cv2.CAP_PROP_FRAME_COUNT))#動画を画像にしたときの総枚数 size=(640,480)#サイズ指定 frame_rate = int(mv.get(cv2.CAP_PROP_FPS))#読み込んだ動画のFPS(フレームレート)を調べる fourcc = cv2.VideoWriter_fourcc('m','p','4','v')#保存形式 save = cv2.VideoWriter('pro_save_mask.mp4',fourcc,frame_rate,size)#動画を保存するためのモデルを作成~こういう形で保存しますね、みたいなイメージ print("保存中...") for i in range(frame_count):#総枚数の数繰り返す ch,frame=mv.read() if ch==True:#画像を取り出すことができたら、下の処理をします frame=cv2.resize(frame,(640,480))#上でsize=(640,480)で指定していますが、念のため mask_gousei_show=mask_gousei(frame,mask_img)#マスクを合成する自作関数に、人の画像とマスクの画像を渡す save.write(mask_gousei_show)#保存 print("保存しました") save.release() #ファイルを閉じる cv2.destroyAllWindows()#ウインドウを閉じる |
このプログラムはこちら→「Pythonプログラムで動画に写る人の顔にマスクを着ける方法」の投稿で紹介したプログラムにMP4形式で保存するプログラムを追加しものです。
逆再生にした処理をMP4形式で保存した動画とプログラム
動画
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import cv2 mv= cv2.VideoCapture('video_koma.mp4')#逆再生前の動画の読み込み frame_count =int(mv.get(cv2.CAP_PROP_FRAME_COUNT))#動画のフレームをすべて取得 size=(640,480)#サイズ指定 frame_rate = int(mv.get(cv2.CAP_PROP_FPS))#読み込んだ動画のFPS(フレームレート)を調べる fourcc = cv2.VideoWriter_fourcc('m','p','4','v')#保存形式 save = cv2.VideoWriter('pro_save_gyaku.mp4',fourcc,frame_rate,size)#動画を保存するためのモデルを作成~こういう形で保存しますね、みたいなイメージ #cv2.VideoWriter('保存する名前',保存形式,frame_rate,size) print("保存中...") mv_data=[]#1フレームずつの動画データを入れるリスト #リストデータに動画の全フレームを追加している for i in range(frame_count): ch,frame=mv.read()#1フレームずつ取り出す if ch==True:#取り出せたら、変数chにTrueが入ります frame=cv2.resize(frame,(640,480))#サイズを小さくしてリストに追加しないとエラーがでる mv_data.append(frame)#サイズを小さくしたデータをリストに追加 #スライスを使ってリストの並びを逆順にする mv_data=mv_data[::-1] for i in range(len(mv_data)): frame=mv_data[i]#変数frameに逆順にしたデータが1フレーム(画像)ずつ入る frame=cv2.resize(frame,(640,480))#上でsize=(640,480)で指定していますが、念のため save.write(frame)#保存 print("保存しました") save.release() # ファイルを閉じる cv2.destroyAllWindows()#ウインドウを閉じる |
このプログラムはこちら→「Pythonで動画を逆再生にするプログラムを紹介します」の投稿で紹介したプログラムにMP4形式で保存するプログラムを追加しものです。
MP4形式の動画に保存をして良かった点
・cv2.imshowで動画を表示するよりもカクカクせず滑らかに映る。
・画面録画で撮るとパソコンの背景やプログラムなどの余計な部分が映りますが、プログラムで保存すると余計な部分が映らない。
参考サイト
・OpenCVを使った動画の保存について
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html
・FPS(フレームレート)について
https://nvr.bz/topics/knowledge/what-framerate.php