はじめに
OpenCVではVideoCaptureクラスで動画撮影や動画ファイルの読み込みを行うことができます。
この記事ではWebカメラから動画を取得する方法を紹介します。
また、Macの場合、お手持ちのiPhoneをワイヤレスのWebカメラとして使用し、OpenCVで動画としてキャプチャすることも可能です。
事前準備
カメラが必要です。
- Webカメラ。ノートパソコンの場合、内臓のカメラも使えます。USB接続のカメラももちろんOK。
- カメラの種類にっよては事前にドライバーのインストールが必要になるかもしれません。
- Macをお使いの場合はiPhoneでも可。
cv2.VideoCaptureクラス
OpenCVでは動画のキャプチャにcv2.VideoCapture
クラスを使用します。
カメラによるキャプチャでは下のコンストラクタでインスタンスを生成します。
引数
名称 | 説明 |
index(必須) | ビデオキャプチャデバイスのID。0、1、2などの整数を設定します。 |
apiPreference(オプション) | ビデオキャプチャデバイスのアクセスに使用するAPIの優先度を指定するためのオプション引数です。この引数を使用することで、特定のカメラAPIを優先的に選択したり、デフォルトのAPI選択動作を調整したりすることができます。(デフォルト:cv2.CAP_ANY ) |
apiPreference
を指定することで、特定のプラットフォームやデバイスでのカメラアクセス方法を制御できます。
設定可能な値を下の表にまとめました。
apiPreference | 説明 |
cv2.CAP_ANY | 利用可能なすべてのカメラAPIを試行し、最初に利用可能なものを選択します。(デフォルト値) |
cv2.CAP_V4L2 | Video for Linux 2 (V4L2) APIを使用してカメラデバイスにアクセスします。Linuxで使用する場合があります。 |
cv2.CAP_DSHOW | DirectShow APIを使用してカメラデバイスにアクセスします。Windowsで使用する場合があります。 |
cv2.CAP_MSMF | Microsoft Media Foundation APIを使用してカメラデバイスにアクセスします。Windowsで使用する場合があります。 |
戻り値
cv2.VideoCapture
クラスのインスタンス。
使い方
基本的な使い方は次の様な手順となります。
- ビデオキャプチャデバイスの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で確認したビデオキャプチャデバイスのIDをコンストラクタの引数として指定します。
cap = cv2.VideoCapture(0)
- フレームの読み取り:
cv2.VideoCapture
クラスのcap.read()
メソッドを使用して、カメラから1フレームを読み取ります。
戻り値のret
はフレームの読み取りが成功したかどうかを示すブール値、frame
は読み取られたフレームの画像データです。
ret, frame = cap.read()
- ビデオキャプチャの終了:
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カメラとして使用することができます。下記リンクの手順で準備をします。
MacでiPhoneをWebカメラとして使用する
連係カメラを使って、iPhoneをMacのWebカメラまたはマイクとして使用したり、強力なiPhoneカメラと追加のビデオエフェクトを利用したりできます。ワイヤレスで接続したり、USBケーブルで有線接続したりできます。
筆者の環境ではビデオキャプチャデバイスID = 0として、iPhoneが認識されました。
前章のサンプルコードで特別なプログラムの修正をすることなく、iPhoneのカメラで動画をキャプチャすることができました。ワイヤレス接続でしたが、フレームレートはPowerbook Proの内蔵カメラの約30fpsとほぼ同じで、約29fpsでした。
サンプルコードを動作させると、下の様な警告が表示されるかもしれませんが、OKボタンをクリックします。
macOSではシステム情報 アプリでも、接続されているカメラを確認することができます。
システム情報 アプリを起動し、ウィンドウの左の「ハードウェア」→「カメラ」をクリックすると、接続されているカメラを確認することができます。
筆者の環境では下の様になりました。内蔵カメラ、iPhoneの2つのカメラが認識されています。
おわりに
cv2.VideoCapture
クラスの基本的な使用方法について解説しました。よくあるトラブルとして、動画のキャプチャができないことがあります。ビデオキャプチャデバイスのIDを確認するサンプルコードを紹介しましたので、トラブル解決の手助けに使って頂ければと思います。
また、このクラスを使用して、動画を読み込むこともできますので、別の投稿で紹介したいと思います。
ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。
参考リンク
cv::VideoCapture Class Reference
Class for video capturing from video files, image sequences or cameras.
VideoCapture Class Reference
Goal. - Learn to read video, display video, and save video. - Learn to capture video from a camera and display it. - You will learn these functions : cv.VideoCapture(), cv.VideoWriter()
■(広告)OpenCVの参考書としてどうぞ!■
(広告)あなたに合ったプログラミング スクールが見つかるかも
プログラミングの学習が、新しい世界を開きます。副業からキャリアの転換まで、目標に向かって一歩を踏み出しましょう。
これらのプログラミング スクールは、あなたの目的に合わせて選択できるさまざまなプログラムを提供しています。どのスクールを選ぶにせよ、プログラミングは未来への扉を開き、新しい機会を切り開く手段として素晴らしい選択です。あなたの夢や目標を実現する第一歩を踏み出す準備はできていますか?