今回はPythonのライブラリ「OpenCV」を使って、Webカメラで撮影した動画をMP4形式で保存する方法を紹介する。

Video I/Oの確認

OpenCVからWebカメラにアクセスする場合、Video I/Oが有効化されている必要があるため、まずは設定値を確認しておこう。

下記のPythonコードを実行すると、設定値の一覧が返される。

print(cv2.getBuildInformation())

Video I/Oの「FFMPEG」がYESとなっていればOK。

コード全文

まずはコード全文を見てもらう。

import cv2
import numpy as np

# 0=内蔵カメラ
cap = cv2.VideoCapture(0)

fps = int(cap.get(cv2.CAP_PROP_FPS))
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (w, h))

while True:
	ret, frame = cap.read()
	cv2.imshow('frame', frame)
	out.write(frame)

	if cv2.waitKey(1) & 0xFF == ord('q'):
		break

cap.release()
out.release()
cv2.destroyAllWindows()

ライブラリの読み込み

まず、最初の2行は今回使用するライブラリの読み込み。

import cv2
import numpy as np

Webカメラで取得した映像はNumpy配列として扱われるので、Numpyも読み込んでおく。

内蔵カメラを呼び出し映像を読み込む

OpenCVのVideoCaptureクラスを呼び出す。
引数の0はWebカメラを意味する。

# 0=Webカメラ
cap = cv2.VideoCapture(0)

動画の保存形式の設定

変数fps、w、hは名前のとおり、保存する動画のFPS、サイズを意味し、VideoWriterの引数にそれぞれの値を渡す。

fps = int(cap.get(cv2.CAP_PROP_FPS))
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (w, h))

Webカメラで撮影した映像を表示・保存

映像はwhile文を使って、フレーム単位で取得する。

capオブジェクトのread関数は、正常に読み込めたかどうかをbool値で、そして読み込んだフレームの画像の配列をndarrayで返す。

cv2.imshowで読み込んだフレームを表示し、out.writeで保存をおこなっている。

while True:
	ret, frame = cap.read()
	cv2.imshow('frame', frame)
	out.write(frame)

	if cv2.waitKey(1) & 0xFF == ord('q'):
		break

if文のところでは「q」が入力された時点で、while文を抜けるようにしている。

Webカメラを閉じる

処理が終了したら、開いていたWebカメラや動画オブジェクトを閉じて終了。

cap.release()
out.release()
cv2.destroyAllWindows()

完成したコードを実行すると、Webカメラが起動し映像が表示される。

終了する時は「q」を押す。
するとWebカメラが閉じられ、ディレクトリ内に「output.mp4」が保存されているはずだ。