OpenCVで動画作成 VideoWriter - Python徹底解説

 

{{DZ_TITLE}}
OpenCVで簡単にAVIやMP4等の動画が作成可能です。

基本形

灰色だけの動画「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)

画像乱れについて

opencv-videowriter-001.png 画像の型が間違っていることがあります。
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 - OpenCV徹底解説

おすすめ記事

無地の画像を作成 - OpenCV、Python徹底解説
無地の画像を作成 - OpenCV、Python徹底解説
画像 切り出し、トリミング - OpenCV、Python徹底解説
画像 切り出し、トリミング - OpenCV、Python徹底解説
気象庁 台風位置表 をpython foliumで可視化する
気象庁 台風位置表 をpython foliumで可視化する
Linux ( raspberry pi ) USBを文字化けなくmountする(自動も対応)
Linux ( raspberry pi ) USBを文字化けなくmountする(自動も対応)
Python徹底解説
Python徹底解説
Unityでキャラクターを動かす(左右&前進加速)
Unityでキャラクターを動かす(左右&前進加速)
Supponsered

もっとPythonを学びたいなら

Python徹底解説
Python - Pandas徹底解説

外部サイト
↓プログラムを学んでみたい場合、学習コースなどもおすすめです!

Comments

comments powered by Disqus