目次
概要
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()
コメント