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

Video I/Oの確認

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

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

1
print(cv2.getBuildInformation())

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

コード全文

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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行は今回使用するライブラリの読み込み。

1
2
import cv2
import numpy as np

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

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

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

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

動画の保存形式の設定

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

1
2
3
4
5
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で保存をおこなっている。

1
2
3
4
5
6
7
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カメラや動画オブジェクトを閉じて終了。

1
2
3
cap.release()
out.release()
cv2.destroyAllWindows()

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

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