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のインスタンスへ設定することができます。
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
メソッドでカメラからのフレーム情報を読み込み、VideoWriter
のwrite
メソッドで動画に書き込んでいます。
【リソースの解放】
# リソースの解放 camera_capture.release() video_writer.release()
プログラムの終わりでは、VideoCapture
とVideoWriter
のオブジェクトを適切に開放することが重要です。リソースの解放は、release
メソッドを使用することで実行できます。
まとめ
PythonでOpenCVを使ってカメラの読み込みをする方法を解説しました。
コンピュータビジョンではカメラフレームのストリームを読み込んで画像処理したいケースも多く存在します。OpenCVでは、カメラ読み込みのクラスとしてVideoCapture
クラスが用意されています。
この記事では、VideoCapture
でカメラフレームのストリームを一定時間読み込んで、VideoWriter
で書き込む方法を例にカメラの読み込みの基本を紹介しました。
OpenCVは、非常に強力なコンピュータビジョンのライブラリで、カメラの入出力は画像を扱うにあたっての基本となります。しっかりと使い方を理解していただきたいと思います。