2022年2月2日水曜日

【OpenCV】VideoWriterによる動画の保存

 画像処理ライブラリOpenCVで動画ファイルを保存する場合、VideoWriter_fourccにより動画コーデックを指定しVideoWriterでVideoWriter型オブジェクトを生成、VideoWriter型オブジェクトに画像を追加し動画として保存する。
OpenCVを使うには次のようにインポートが必要。

import cv2




1. VideoWriterの書式

VideoWriterの書式は以下

cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
引数 意味
filename 保存する動画ファイル名
fourcc FourCC(Four Character Code:フォーシーシー)。動画のコーデックを指定する4文字のコード。'MJPG','mp4v','X264','XVID'等(使用できるコーデックは環境に依存する)。
(*'mp4v')もしくは('m', 'p', '4', 'v')の形式で指定する
fps 動画のフレームレート。フレーム/秒
frameSize 動画のフレームサイズ。(x, y)のピクセル
isColor オプション。0以外の場合カラーフォーマット、0の場合はグレースケールフォーマットとなる。


2. 動画の保存例

 位置とサイズが変わる青い円をコーデックX264、コンテナ(拡張子)mp4で動画保存する場合。VideoWriter_fourccでコーデックのfourccを指定しVideoWriterでVideoWriterオブジェクトを生成、そこに画像を記録する。最後にvideo.release()でVideoWriterオブジェクトを解放する。 フレームレートは25.0フレーム/秒、フレームサイズは640x360を指定。同じサイズの画像を追加して動画化する。

import cv2
import numpy as np

fourcc = cv2.VideoWriter_fourcc(*'X264')  
video  = cv2.VideoWriter('movie.mp4', fourcc, 25.0, (640, 360)) 

for i in range(100):
    img = np.zeros((360, 640, 3), np.uint8)
    cv2.circle(img, (i*6, i*3), i, (255, 0, 0), -1, cv2.LINE_AA)
    video.write(img) 
    
video.release()




同じ動画をコーデックMJPG、コンテナ(拡張子)MOVで保存する場合。

import cv2
import numpy as np

fourcc = cv2.VideoWriter_fourcc(*'MJPG')  
video  = cv2.VideoWriter('movie.MOV', fourcc, 25.0, (640, 360)) 

for i in range(100):
    img = np.zeros((360, 640, 3), np.uint8)
    cv2.circle(img, (i*6, i*3), i, (255, 0, 0), -1, cv2.LINE_AA)
    video.write(img) 
    
video.release()


同じ動画をコーデックmp4v、コンテナ(拡張子)mp4で保存する場合。

import cv2
import numpy as np

fourcc = cv2.VideoWriter_fourcc(*'mp4v')  
video  = cv2.VideoWriter('movie.mp4', fourcc, 25.0, (640, 360)) 

for i in range(100):
    img = np.zeros((360, 640, 3), np.uint8)
    cv2.circle(img, (i*6, i*3), i, (255, 0, 0), -1, cv2.LINE_AA)
    video.write(img) 
    
video.release()


同じ動画をコーデックXVID、コンテナ(拡張子)aviで保存する場合。

import cv2
import numpy as np

fourcc = cv2.VideoWriter_fourcc(*'XVID')  
video  = cv2.VideoWriter('movie.avi', fourcc, 25.0, (640, 360)) 

for i in range(100):
    img = np.zeros((360, 640, 3), np.uint8)
    cv2.circle(img, (i*6, i*3), i, (255, 0, 0), -1, cv2.LINE_AA)
    video.write(img) 
    
video.release()


3. リファレンス

OpenCV > cv::VideoWriter Class Reference > VideoWriter()
OpenCV > cv::VideoWriter Class Reference > fourcc()
Video Codecs by FOURCC

使用したバージョン:Python 3.8.12 / OpenCV 4.5.5

0 件のコメント:

コメントを投稿