OpenCV – VideoWriter で動画ファイルを作成する方法

目次

概要

OpenCV の VideoWriter で動画ファイルを作成する方法について解説します。

VideoWriter

cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
引数
名前 デフォルト値
filename str
出力ファイル名
fourcc list of strs
FourCC を表す4つ文字のリスト (例: [‘H’, ‘2’, ‘6’, ‘4’])
fps float
FPS
frameSize tuple of 2-ints
フレームの大きさ
isColor bool True
write() で書き込む画像がグレースケールの場合は False にする

Web カメラから映像を取得し、動画として保存する

VideoCapture で Web カメラから映像を取得し、動画ファイルに出力する方法を紹介します。

In [ ]:
import cv2

# VideoCapture を作成する。
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# VideoWriter を作成する。
fourcc = cv2.VideoWriter_fourcc(*"DIVX")
writer = cv2.VideoWriter("output.avi", fourcc, fps, (width, height))

while True:
    # 1フレームずつ取得する。
    ret, frame = cap.read()
    if not ret:
        break  # 取得に失敗した場合

    writer.write(frame)  # フレームを書き込む。

writer.release()
cap.release()

出力した動画ファイルが開けない場合

出力した動画が開けない場合は、フレームの書き込みに失敗しています。考えられる要因を以下に記載します。

  • fourcc に指定したエンコード方式に対応していない
  • frameSize に指定した大きさと実際に writer.write() で書き込むフレームの大きさが一致していない
  • isColor=True を指定しているのに、writer.write() で書き込むフレームがグレースケール形式になっている

動画ファイルを開き、各フレームを画像として保存する

動画ファイルを開き、各フレームを画像として保存する方法を紹介します。

In [ ]:
from pathlib import Path

import cv2

# 保存するディレクトリ
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

# VideoCapture を作成する。
cap = cv2.VideoCapture("sample.avi")

n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # フレーム数を取得する。
n_digits = len(str(n_frames))  # フレーム数の桁数を取得する。

while True:
    # 1フレームずつ取得する。
    ret, frame = cap.read()
    if not ret:
        break  # 取得に失敗した場合

    # フレームを画像として保存する。
    frame_no = int(cap.get(cv2.CAP_PROP_POS_FRAMES))

    save_path = output_dir / f"frame_{frame_no:0{n_digits}d}.png"
    cv2.imwrite(str(save_path), frame)

cap.release()

コメント

コメントする

目次