2022年1月16日日曜日

【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存

画像処理ライブラリOpenCVで動画ファイルを扱う場合、VideoCaptureにより動画ファイルからVideoCapture型オブジェクトを生成する。
OpenCVを使うには次のようにインポートが必要。

import cv2




1. 動画ファイルの読み出しとプロパティ取得

動画ファイルからVideoCapture型オブジェクトを生成する際には以下のようにする。またVideoCapture型オブジェクトの使用後はreleaseにより解放する。

cap = cv2.VideoCapture(filename)

cap.release()


動画ファイルのプロパティを取得するにはVideoCapture型オブジェクトにたいしてgetを使う。書式は以下。

cv2.VideoCapture.get(propId)

propIdには取得したいProperty identifierを指定する。多数あるが代表的なものは以下。

Property identifier 意味
cv2.CAP_PROP_FRAME_WIDTH フレームの幅
cv2.CAP_PROP_FRAME_HEIGHT フレームの高さ
cv2.CAP_PROP_FPS 動画のフレームレート。フレーム/秒
cv2.CAP_PROP_FRAME_COUNT 動画のフレーム数


例に用いる動画 '1203_640x360.mp4' は以下の 動画AC「側転をしてカメラ目線で笑顔でポーズする女性」を使用。





import cv2

# VideoCaptureオブジェクトの生成
cap = cv2.VideoCapture('1203_640x360.mp4')

# getメソッドによるプロパティ取得
# フレームの幅
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# フレームの高さ
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# フレームレート
print(cap.get(cv2.CAP_PROP_FPS))
# 総フレーム数
print(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# VideoCaptureオブジェクトのリリース
cap.release()

実行結果。以下のプロパティが表示される。
フレームの幅 : 640ピクセル
フレームの高さ : 360ピクセル
フレームレート : 29.97フレーム/秒
総フレーム数 : 201フレーム

640.0
360.0
29.97002997002997
201.0


2. キャプチャー画像の保存

動画ファイルから指定のフレームまたは指定の経過時間のフレームを画像として保存する場合、VideoCapture型オブジェクトにたいしてsetによりフレームまたは経過時間を指定し、readによりフレームを読み出す。
setの書式は

cv2.VideoCapture.set(propId, value)

propIdはフレーム数を指定する際にはcv2.CAP_PROP_POS_FRAMES、経過時間(msec)を指定する場合はcv2.CAP_PROP_POS_MSECを用いる。valueはフレーム数または時間を指定する。


動画のフレーム100を画像に保存する例。

import cv2

# VideoCaptureオブジェクトの生成
cap = cv2.VideoCapture('1203_640x360.mp4')

# フレーム100に移動
cap.set(cv2.CAP_PROP_POS_FRAMES, 100)

# 画像の取得
ret, frame = cap.read()

# 画像保存
cv2.imwrite('frame100.jpg', frame)

# VideoCaptureオブジェクトのリリース
cap.release()

実行結果





動画の4000msec(4秒)のフレームを画像に保存する例。

import cv2

# VideoCaptureオブジェクトの生成
cap = cv2.VideoCapture('1203_640x360.mp4')

# 4000msec(4秒)に移動
cap.set(cv2.CAP_PROP_POS_MSEC, 4000)

# 画像の取得
ret, frame = cap.read()

# 画像保存
cv2.imwrite('msec4000.jpg', frame)

# VideoCaptureオブジェクトのリリース
cap.release()

実行結果





3. リファレンス

OpenCV > cv::VideoCapture Class Reference > VideoCapture()
OpenCV > cv::VideoCapture Class Reference > release()
OpenCV > cv::VideoCapture Class Reference > set()
OpenCV > cv::VideoCapture Class Reference > get()
OpenCV > Flags for video I/O > VideoCaptureProperties

使用したバージョン:Python 3.8.8 / OpenCV 4.0.1

0 件のコメント:

コメントを投稿