【Python・OpenCV】Webカメラで動画をキャプチャするには(cv2.VideoCapture)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV】Webカメラで動画をキャプチャするには(cv2.VideoCapture)

2023-09-26

はじめに

OpenCVではVideoCaptureクラスで動画撮影や動画ファイルの読み込みを行うことができます。
この記事ではWebカメラから動画を取得する方法を紹介します。
また、Macの場合、お手持ちのiPhoneをワイヤレスのWebカメラとして使用し、OpenCVで動画としてキャプチャすることも可能です。

事前準備

カメラが必要です。

  • Webカメラ。ノートパソコンの場合、内臓のカメラも使えます。USB接続のカメラももちろんOK。
  • カメラの種類にっよては事前にドライバーのインストールが必要になるかもしれません。
  • Macをお使いの場合はiPhoneでも可。

cv2.VideoCaptureクラス

OpenCVでは動画のキャプチャにcv2.VideoCaptureクラスを使用します。
カメラによるキャプチャでは下のコンストラクタでインスタンスを生成します。

cv2.VideoCapture(index[, apiPreference])

(広告)OpenCV関連書籍をAmazonで探す

引数

名称説明
index(必須)ビデオキャプチャデバイスのID。0、1、2などの整数を設定します。
apiPreference(オプション)ビデオキャプチャデバイスのアクセスに使用するAPIの優先度を指定するためのオプション引数です。この引数を使用することで、特定のカメラAPIを優先的に選択したり、デフォルトのAPI選択動作を調整したりすることができます。(デフォルト:cv2.CAP_ANY

apiPreferenceを指定することで、特定のプラットフォームやデバイスでのカメラアクセス方法を制御できます。

ポイント

特定のAPIを使用する理由がない限り、通常はapiPreferenceを指定する必要はありません。

設定可能な値を下の表にまとめました。

apiPreference説明
cv2.CAP_ANY利用可能なすべてのカメラAPIを試行し、最初に利用可能なものを選択します。(デフォルト値)
cv2.CAP_V4L2Video for Linux 2 (V4L2) APIを使用してカメラデバイスにアクセスします。Linuxで使用する場合があります。
cv2.CAP_DSHOWDirectShow APIを使用してカメラデバイスにアクセスします。Windowsで使用する場合があります。
cv2.CAP_MSMFMicrosoft Media Foundation APIを使用してカメラデバイスにアクセスします。Windowsで使用する場合があります。
apiPreference

戻り値

cv2.VideoCaptureクラスのインスタンス。

使い方

基本的な使い方は次の様な手順となります。

cv2.VideoCaptureクラスで動画キャプチャの手順

  1. ビデオキャプチャデバイスのIDを確認
  2. インスタンスの作成
  3. フレームの読み取り
  4. ビデオキャプチャの終了
  1. ビデオキャプチャデバイスのIDを確認:

ビデオキャプチャデバイスのIDは、0番目のカメラがデフォルトとなるため「0」を使用する場合が多い様です。
しかし、複数のカメラが接続されている場合、あらかじめビデオキャプチャデバイスのIDを確認する必要があります。
下のサンプルコードで接続されているカメラのインデックスや名前を確認することができます。
ビデオキャプチャデバイスのIDを0〜9までのカメラを調べ、各カメラの解像度を表示します。
7行目の"10"を変更することで、スキャンするIDの数を変更することができます。

'''
ビデオキャプチャデバイスのIDを確認するサンプルコード
'''

import cv2

for i in range(10):
    cap = cv2.VideoCapture(i)
    if not cap.isOpened():
        break
    print(f"Camera {i}: {cap.get(cv2.CAP_PROP_FRAME_WIDTH)}x{cap.get(cv2.CAP_PROP_FRAME_HEIGHT)}")
    cap.release()

筆者の環境で、このサンプルコードを実行結果が下になります。
"Camera 0"と"Camera 1"が表示されたので、ビデオキャプチャデバイスのIDとして「0」と「1」が指定できることが確認できました。

Camera 0: 1920.0x1080.0
Camera 1: 1280.0x720.0
OpenCV: out device of bound (0-1): 2
OpenCV: camera failed to properly initialize!
  1. インスタンスの作成

1で確認したビデオキャプチャデバイスのIDをコンストラクタの引数として指定します。

cap = cv2.VideoCapture(0)
  1. フレームの読み取り

cv2.VideoCaptureクラスのcap.read()メソッドを使用して、カメラから1フレームを読み取ります。
戻り値のretはフレームの読み取りが成功したかどうかを示すブール値、frameは読み取られたフレームの画像データです。

ret, frame = cap.read()
  1. ビデオキャプチャの終了
cap.release()

cv2.VideoCaptureクラスを使用しなくなったら、release()メソッドを呼び出してリソースを解放します。

下のサンプルコードは、USBカメラからのビデオキャプチャを行う簡単な例です。
次の様なプログラムになっています。

・キャプチャーした画像をウィンドウに表示します。
・ファイル名"frame_rate.txt"のファイルにフレームレートを計算して記録します。
・'q'キーを押すとプログラムが終了します。

import cv2
import time

# カメラを指定します。通常、0番目のカメラがデフォルトです。
camera_index = 0

# VideoCaptureのインスタンスを作成します。
cap = cv2.VideoCapture(camera_index)

# カメラが正常に開かれたかを確認します。
if not cap.isOpened():
    print("カメラを開けませんでした。")
    exit()

# フレームレートの初期化
fps = 0
frame_count = 0
start_time = time.time()

while True:
    # カメラから1フレーム読み込みます。
    ret, frame = cap.read()

    # フレームの読み込みに成功した場合
    if ret:
        # フレームを表示します。
        cv2.imshow("Web Camera", frame)


        # 1秒ごとにフレームレートを計算してファイルに追記
        frame_count += 1
        if time.time() - start_time >= 1.0:
            fps = frame_count / (time.time() - start_time)
            with open("frame_rate.txt", 'a') as f:
                print(f"フレームレート: {fps:.2f} FPS", file=f)
            start_time = time.time()
            frame_count = 0


    # 'q'キーを押すとループを終了します。
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# カメラキャプチャを解放し、ウィンドウを閉じます。
cap.release()
cv2.destroyAllWindows()

このサンプルコードは、動画を読み取りながらリアルタイムでフレームレートを計算します。
フレームを1つずつ読み取りながら1秒ごとにフレームレートを計算して表示します。フレーム数と時間の経過からフレームレートを推定し、小数点以下2桁まで記録します。

サンプルコードでは使用していませんが、OpneCVが提供する機能で時間計測を行い、フレームレートを計算することも可能です。下記のリンクをご参照ください。

参考記事

macOSでiPhoneをWebカメラとして使用する場合

macOSではiPhoneをWebカメラとして使用することができます。下記リンクの手順で準備をします。

筆者の環境ではビデオキャプチャデバイスID = 0として、iPhoneが認識されました。
前章のサンプルコードで特別なプログラムの修正をすることなく、iPhoneのカメラで動画をキャプチャすることができました。ワイヤレス接続でしたが、フレームレートはPowerbook Proの内蔵カメラの約30fpsとほぼ同じで、約29fpsでした。

サンプルコードを動作させると、下の様な警告が表示されるかもしれませんが、OKボタンをクリックします。

macOSではシステム情報 アプリでも、接続されているカメラを確認することができます。

システム情報 アプリを起動し、ウィンドウの左の「ハードウェア」→「カメラ」をクリックすると、接続されているカメラを確認することができます。
筆者の環境では下の様になりました。内蔵カメラ、iPhoneの2つのカメラが認識されています。

おわりに

cv2.VideoCaptureクラスの基本的な使用方法について解説しました。よくあるトラブルとして、動画のキャプチャができないことがあります。ビデオキャプチャデバイスのIDを確認するサンプルコードを紹介しましたので、トラブル解決の手助けに使って頂ければと思います。

また、このクラスを使用して、動画を読み込むこともできますので、別の投稿で紹介したいと思います。

ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。

参考リンク

■(広告)OpenCVの参考書としてどうぞ!■

(広告)あなたに合ったプログラミング スクールが見つかるかも

プログラミングの学習が、新しい世界を開きます。副業からキャリアの転換まで、目標に向かって一歩を踏み出しましょう。

これらのプログラミング スクールは、あなたの目的に合わせて選択できるさまざまなプログラムを提供しています。どのスクールを選ぶにせよ、プログラミングは未来への扉を開き、新しい機会を切り開く手段として素晴らしい選択です。あなたの夢や目標を実現する第一歩を踏み出す準備はできていますか?

-Python, プログラミング, 画像処理
-