OpenCVで動画作成 VideoWriter - Python徹底解説
基本形
灰色だけの動画「test.mp4」ファイルが作成されます。
import cv2
import numpy as np
# 幅
W = 640
# 高さ
H = 480
# FPS(Frame Per Second:1秒間に表示するFrame数)
CLIP_FPS = 20.0
# テスト用の背景色
BG_COLOR = ( 79, 62, 70)
filepath = 'test.mp4'
codec = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(filepath, codec, CLIP_FPS, (W, H))
for idx in range(100):
# イメージデータの領域確保
img = np.zeros((H,W,3), np.uint8)
# 背景色で塗りつぶし
img = cv2.rectangle(img , (0,0),(W-1,H-1) , BG_COLOR, -1 )
video.write(img)
video.release()
カメラの撮影データをAVIファイルとして作成する
下記のコードを実行すると、Windowが開いてきてカメラからの画像が表示されると思います。
画面の裏にWindowが隠れている場合があるので要注意です。
エスケープキーを押すことでキャプチャが終了して、AVIファイル「test.mp4」ファイルが完成します。
import cv2
cap = cv2.VideoCapture(0)
filepath = 'test.mp4'
w = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(video.get(cv2.CAP_PROP_FPS)) # フレームレート
codec = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(filepath, codec, fps, (w, h))
while(True):
# カメラから映像を1枚読込む
ret, img = cap.read()
# カメラから読込んだ映像をファイルに書き込む
video.write(img)
# カメラから読み込んだ映像を画面に表示する
cv2.imshow('frame',img)
# エスケープキーが押されたら処理終了
if cv2.waitKey(1) & 0xFF == 27:
break
# Videoを作成時には、開放処理が必要
video.release()
# カメラを使った処理には開放粗利が必要
cap.release()
# Windowを開いた場合は閉じる処理が必要
cv2.destroyAllWindows()
画像ファイルから動画ファイルを作成する
画像ファイルを読み込んで、読込んだ画像を繋げて動画ファイルとして保存する方法です。
このサンプルではtest-0000.png ~ test-0009.png までの10ファイルを動画に変換するプログラムです。
ファイル名や、拡張子などを変えれば、好きな画像の動画ファイルを作成する事が可能です。
import numpy as np
import cv2
# FPS(Frame Per Second:1秒間に表示するFrame数)
CLIP_FPS = 20.0
filepath = 'test.mp4'
# 画像を読み込む
img = cv2.imread('test-0000.png')
# 読込んだ画像のサイズより、動画サイズを決定する
w = img.shape[1]
h = img.shape[0]
codec = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(filepath, codec, CLIP_FPS, (w, h))
for idx in range(10):
# 画像ファイルを読み込む
img = cv2.imread('test-%04d.png'%(idx))
# カメラから読込んだ映像をファイルに書き込む
video.write(img)
# Videoを作成時には、開放処理が必要
video.release()
いろいろな動画形式の作成方法
cv2.VideoWriter_fourcc に渡す引数で、動画の形式を変更可能です。
OSなどの環境やバージョンにより使えるものが変わってきます。
*‘mp4v’ : mp4 向け (拡張子.mp4)
*‘DIVX’ : avi 向け (拡張子.avi)
画像乱れについて
画像の型が間違っていることがあります。
VideoWriterを使う場合uint8の型を指定する必要があります。
よくある問題が起こるパターンとして、画像の新規作成した場合
初期の型がfloat64だったりすることです。
参照 : 無地の画像を作成
import numpy as np
np.zeros((height, width, 3))
対処法として、下記の様にunit8で型を指定する必要があります。
import numpy as np
np.zeros((height, width, 3), np.uint8))
もしくは 下記の様にvideo.write 時に型を指定するのも一つの方法ですが、生成部分を直す方が筋だとは思います。
import numpy as np
video.write(img.astype(np.uint8))
関連
おすすめ記事
スクレイピング - Python徹底解説
みちびき 高精度 L1S対応、Sony spresenseは買いなのか?
Django 目次 - Python
動画ファイルの読込 - OpenCV、Python徹底解説
Pandas徹底解説 - Python
無地の画像を作成 - OpenCV、Python徹底解説
Supponsered
もっとPythonを学びたいなら
Python徹底解説
Python - Pandas徹底解説
外部サイト
↓プログラムを学んでみたい場合、学習コースなどもおすすめです!