【Python】Webカメラ・内蔵カメラの映像(動画)を録画:OpenCVの利用

時計 2022.10.26 / 時計

【Python】Webカメラ・内蔵カメラの映像(動画)を録画:OpenCVの利用

記事ではPythonOpenCVによる、カメラ(Web、内蔵)の映像(動画)を録画する方法について解説していきます。

OpenCVとは画像処理や動画処理、画像解析に利用されるライブラリです。OpenCVを利用すると、映像録画アプリケーションや防犯カメラのようなシステムを簡単に作成できます。

OpenCVについて詳しくは以下記事をご参照ください。

本記事を参考にして、OpenCVで映像を録画する方法について理解を深めてください。

カメラの映像(動画)を録画する流れ

以下にカメラからの映像を録画するプログラムの流れを記します。

  1. OpenCVのインポート
  2. ビデオキャプチャの取得
  3. コーデックの設定
  4. 動画ファイルの保存先、FPS、サイズを指定
  5. 動画の録画を行う
  6. 録画の終了操作が実行されたら録画の終了処理を行う

各項目の詳細については次項より詳しく解説していきます。

OpenCVのインポート

カメラ映像を録画するためにOpenCVを使用します。そのためスクリプトの先頭でOpenCVをインポートします。

import cv2
注意

インポートではimport opencvではなく、import cv2と記述します

Pythonの環境でまだOpenCVをインストールしていない場合はpipコマンドでインストールしてください。

pip install opencv-python

ビデオキャプチャの取得

cv2.VideoCapture()を使ってビデオキャプチャを取得します。

IT用語の確認

ビデオキャプチャとは映像を扱う機器(ここではWebカメラや内蔵カメラ)からの映像データをパソコンに取り込むこと

import cv2

# ビデオキャプチャの取得
cap = cv2.VideoCapture(0)

上記では取得したVideoCaptureオブジェクトは変数capに格納しています。

VideoCapture()の引数にはパソコンのカメラ番号を指定します。ノートパソコンに内蔵されているカメラであれば0、USBで接続したカメラは1を指定します。

コーデック(fourcc)の設定

cv2.VideoWriter_fourcc()を使用してコーデック(fourcc)を指定します。

IT用語の確認

コーデックとはデータの圧縮と復元(エンコードとデコード)を行う機器・ソフトウェアです。映像や音声などの処理に利用されます

import cv2

# ビデオキャプチャの取得
cap = cv2.VideoCapture(0)
# コーデック(fourcc)の設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')

動画のファイルの保存先、FPS、サイズを指定

録画する動画ファイルの設定をcv2.VideoWriter()で行います。

構文

cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=ture)

ここでは動画の保存先とFPS、サイズを指定します。以下のようにして生成されたVideoWriterオブジェクトを変数に格納してください。

import cv2

# ビデオキャプチャの取得
cap = cv2.VideoCapture(0)
# コーデック(fourcc)の設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 動画ファイルの設定(保存先、FPS、サイズ)
video = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))

動画の録画を行う

カメラ映像の読み込みができているかの判定

VideoCapture()でカメラからの映像が問題なく読み込みできているかをVideoCaptureクラスのisOpened()メソッドを使って確認できます。

映像の読み込みに問題がなければTrueを返します。以下プログラムではwhile文と組み合わせて、映像の読み込みに問題がない限りwhile内の処理(録画の処理)を実行するようにします。

import cv2

# ビデオキャプチャの取得
cap = cv2.VideoCapture(0)
# コーデック(fourcc)の設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 動画ファイルの設定(保存先、FPS、サイズ)
video = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
# カメラ映像の読み込みに問題がない限り処理を継続する
while(cap.isOpened()):
    # ここに処理を記入

カメラ映像から画像データを取得

カメラ映像から1フレーム分の画像データを取得するためにVideoCaptureクラスのread()メソッドを使います。

read()メソッドの返り値はBool値(TrueまたはFalse)とキャプチャした画像データです。以下のように二つの変数に格納します。

# Bool値とキャプチャ画像を変数に格納
ret, frame = cap.read()

Bool値は正しく画像データが読み込めればTrueを返します。if判定を使って、画像データが正しく読み込めていなければwhile文をbreakで抜けるようにしましょう。

# カメラ映像の読み込みに問題がない限り処理を継続する
while(cap.isOpened()):
    # Bool値とキャプチャ画像を変数に格納
    ret, frame = cap.read()
    if ret==True:
        # 処理を記入
    else:
        break

リサイズを行う

read()で読み込んだ画像をVideoWriter()で指定したサイズにリサイズします。読み込んだ画像をリサイズするにはresize ()メソッドを使用します。

# リサイズを行う
frame = cv2.resize(frame, (640,480))

録画の実行

VideoWriterクラスのwrite()メソッドでフレームの書き込み、つまり録画を実行します。

write()メソッドの引数にはread()メソッドで取得したフレームを指定します。

# フレームの書き込み(保存)
out.write(frame)

録画中の映像(画像)を表示する

録画中の映像(画像)を表示するにはcv2.imshow()を使用します。

# 録画中の映像(画像)を表示
cv2.imshow('recoding', frame)

特定のキーが入力されたら録画を終了する

録画を終了するタイミングとして、ここでは特定のキーが入力されたら録画を終了するようにします。

以下は「q」が押されたらbreakしてwhile文を抜けるようにしています。

# qが押されたら録画を終了
if cv2.waitKey(1) & 0xFF == ord('q'):
    break

録画の終了処理

録画を終了する際は必ずrelease()やdestroyAllWindows()を使って終了処理を行ってください。

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

プログラムの全体ソースコード

ここまでがPythonのOpenCVでカメラ映像を録画する方法です。

以下に本記事で解説したスクリプトの全体ソースコードを記します。

import cv2

# ビデオキャプチャの取得
cap = cv2.VideoCapture(0)
# コーデック(fourcc)の設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 動画ファイルの設定(保存先、FPS、サイズ)
video = cv2.VideoWriter('C:\EAS\output.avi', fourcc, 20.0, (640,480))
# 動画の読み込みに問題がない限り処理を継続する
while(cap.isOpened()):
    # Bool値とキャプチャ画像を変数に格納
    ret, frame = cap.read()
    if ret==True:
        # リサイズを行う
        frame = cv2.resize(frame, (640,480))
        # フレームの書き込み(保存)
        video.write(frame)
        # 録画中の映像(画像)を表示
        cv2.imshow('recoding', frame)
        # qが押されたら録画を終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 終了処理
cap.release()
video.release()
cv2.destroyAllWindows()

OpenCVによる画像処理・動画処理

画像から顔認識・顔検出する方法

PythonのOpenCVによる画像から顔認識・顔検出する方法については以下記事をご参照ください。

カメラ映像や動画から顔認識・顔検出する方法

PythonのOpenCVによるカメラの映像や動画からリアルタイムで顔認識・顔検出する方法については以下記事をご参照ください。