OpenCV

【Python】OpenCVによるカメラの読み込みの基本

【Python】OpenCVによるカメラの読み込みの基本

PythonでOpenCVを使ってカメラの読み込みをする方法を解説します。 

OpenCVによるカメラの読み込み

OpenCVは、有名なコンピュータービジョンのライブラリです。OpenCVのPythonバインドであるcv2モジュールを使用することで、PythonでOpenCVの機能を使用することができます。

コンピュータビジョンではカメラフレームのストリームを読み込んで画像処理したいケースも多く存在します。OpenCVでは、カメラ読み込みのクラスとしてVideoCaptureクラスが用意されています。

この記事では、PythonでOpenCVを使ってカメラの読み込みをする方法について紹介します。

VideoCaptureは、動画ファイルの読み込みでも使用されます。動画ファイルの読み込みの基本は「OpenCVによる動画入出力の基本」でまとめているので参考にしてください。

VideoCaptureを用いたカメラの読み込み

ここでは、VideoCaptureクラスを用いてカメラの読み込みをする方法について紹介していきます。

基本的な使い方

VideoCaptureクラスを使ってカメラを読み込むには以下のようにします。

import cv2

# カメラ設定
fps = 30
size = (1920, 1080)

# VideoCaptureのインスタンスを生成
camera_capture = cv2.VideoCapture(0)
if not camera_capture.isOpened():
    print("カメラが開けません。デバイスを確認してください")
    exit()

# カメラの設定
camera_capture.set(cv2.CAP_PROP_FPS, fps)
camera_capture.set(cv2.CAP_PROP_FRAME_WIDTH, size[0])
camera_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, size[1])

# カメラで読み込んだ画像を出力するためのVideoWriteの準備
video_writer = cv2.VideoWriter(
    "capture.avi", cv2.VideoWriter_fourcc(*"I420"), fps, size
)
if not video_writer.isOpened():
    print("VideoWriterの生成に失敗しました。コーデックやファイル名を確認してください。")
    camera_capture.release()
    exit()

# カメラで読み込むフレーム数 (10秒)
num_frames = 10 * fps

# カメラのフレームを読み込みつつ、ファイル出力を行う
while num_frames > 0:
    success, frame = camera_capture.read()
    if not success:
        print("フレームの読み取りに失敗しました。")
        break
    video_writer.write(frame)
    num_frames -= 1

# リソースの解放
camera_capture.release()
video_writer.release()

上記のプログラムを実行するとカメラから10秒分の動画を撮影し、capture.aviファイルに出力します。プログラム構成は「OpenCVによる動画入出力の基本」で紹介している動画ファイルの読み込み方法とほとんど同じですが、カメラデバイスを指定する点で違いがあります。以降で上記プログラムの各ポイントを説明していきます。

【モジュールのインポート】

import cv2

OpenCVの機能を使用するためにcv2モジュールをインポートしておきます。

VideoCaptureインスタンス作成とカメラ設定】

# カメラ設定
fps = 30
size = (1920, 1080)

# VideoCaptureのインスタンスを生成
camera_capture = cv2.VideoCapture(0)
if not camera_capture.isOpened():
    print("カメラが開けません。デバイスを確認してください")
    exit()

# カメラの設定
camera_capture.set(cv2.CAP_PROP_FPS, fps)
camera_capture.set(cv2.CAP_PROP_FRAME_WIDTH, size[0])
camera_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, size[1])

カメラの読み込むためには、VideoCaptureのインスタンスを生成します。動画ファイルを読み込む際と違い、カメラを読み込む際にはファイル名ではなくカメラのデバイス番号を指定します。

カメラデバイスは通常「0」が一般的ですが、外部カメラなどを使用する場合は「1」など別の数字である場合があります。OpenCVにはカメラデバイス番号をリストアップするようなメソッドは存在しませんので、順に番号を試して確認するといったことが必要です。

使用しているカメラのFPSや解像度に応じて、setメソッドを使用してカメラの情報をVideoCaptureのインスタンスへ設定することができます。

Note

FPSやsizeについては、読み込んだ後にgetメソッドで取得することも可能です。しかし、VideoCaptureは正確なFPS等の情報を返却できない可能性があります。明確にデバイスの情報が分かっている場合には上記のようにsetで設定する方が確実です。

VideoWriterインスタンス作成】

# カメラで読み込んだ画像を出力するためのVideoWriteの準備
video_writer = cv2.VideoWriter(
    "capture.avi", cv2.VideoWriter_fourcc(*"I420"), fps, size
)
if not video_writer.isOpened():
    print("VideoWriterの生成に失敗しました。コーデックやファイル名を確認してください。")
    camera_capture.release()
    exit()

カメラで読み込んだ画像を動画として保存するためにVideoWriterのインスタンスを生成します。「OpenCVによる動画入出力の基本」の説明の中でコーデック指定方法を含めて詳細説明しているので参考にしてください。

【カメラフレームの読み込みと動画の書き込み】

# カメラで読み込むフレーム数 (10秒)
num_frames = 10 * fps

# カメラのフレームを読み込みつつ、ファイル出力を行う
while num_frames > 0:
    success, frame = camera_capture.read()
    if not success:
        print("フレームの読み取りに失敗しました。")
        break
    video_writer.write(frame)
    num_frames -= 1

上記はカメラで読み込んだフレームを動画に書き込んでいる部分です。まずは、カメラで読み込むフレーム数をnum_framesで定義しています。

whileループ内では、num_framesを減らしていきながら0になるまでreadメソッドでカメラからのフレーム情報を読み込み、VideoWriterwriteメソッドで動画に書き込んでいます。

【リソースの解放】

# リソースの解放
camera_capture.release()
video_writer.release()

プログラムの終わりでは、VideoCaptureVideoWriterのオブジェクトを適切に開放することが重要です。リソースの解放は、releaseメソッドを使用することで実行できます。

まとめ

PythonでOpenCVを使ってカメラの読み込みをする方法を解説しました。

コンピュータビジョンではカメラフレームのストリームを読み込んで画像処理したいケースも多く存在します。OpenCVでは、カメラ読み込みのクラスとしてVideoCaptureクラスが用意されています。

この記事では、VideoCaptureでカメラフレームのストリームを一定時間読み込んで、VideoWriterで書き込む方法を例にカメラの読み込みの基本を紹介しました。

OpenCVは、非常に強力なコンピュータビジョンのライブラリで、カメラの入出力は画像を扱うにあたっての基本となります。しっかりと使い方を理解していただきたいと思います。