はじめに
cv2.VideoCaptureを使ったWebカメラと動画ファイルから画像の取得して保存する方法を下の記事で紹介しました。
これらの記事では、特に説明をしていなかったcv2.VideoCapture
で取得、設定できるプロパティーについて解説します。
cv2.VideoCapture
のプロパティは、カメラまたは動画ファイルの動作や設定を制御するためのパラメータです。
カメラのプロパティを使用すると、さまざまな設定(解像度やフレームレートの設定、明るさやコントラストの調整、フォーカスの制御など)を制御できます。
また、動画ファイルでは解像度ややフレームレート、動画ファイル内の総フレーム数などの情報を取得したり、再生位置を制御したり、ビデオファイルに関する詳細な設定を行ったりすることができます。
プロパティーを取得するget()関数
cv2.VideoCapture
クラスのget()
関数は、カメラまたは動画ファイルから設定値を取得するために使用されます。
引数
名称 | 説明 |
propId(必須) | VideoCapturePropertiesで定義されている識別子 |
戻り値
指定されたプロパティの値。cv2.VideoCapture
クラスでサポートされていないプロパティを指定すると、0 が返されます。
プロパティーを設定するset()関数
cv2.VideoCapture
クラスのset()
関数は、カメラまたは動画ファイルの設定を変更するために使用されます。
引数や戻り値は下の通りとなります。
引数
名称 | 説明 |
propId(必須) | VideoCapturePropertiesで定義されている識別子 |
value(必須) | プロパティーに設定する値 |
戻り値
cv2.VideoCapture
クラスでサポートされているプロパティを指定すると、True
が返されます。
代表的なプロパティー
cv2.VideoCapture
をクラスを使用して設定できるプロパティは多岐にわたりますが、以下に代表的なプロパティーの一覧を示します。
プロパティー | 対象 | 説明 |
cv2.CAP_PROP_FRAME_WIDTH | カメラ および 動画ファイル | フレームの幅を設定または取得します。 |
cv2.CAP_PROP_FRAME_HEIGHT | カメラ および 動画ファイル | フレームの高さを設定または取得します。 |
cv2.CAP_PROP_FPS | カメラ および 動画ファイル | フレームレート(FPS)を設定または取得します。 |
cv2.CAP_PROP_FOURCC | カメラ および 動画ファイル | ビデオコーデックを設定または取得します。fourcc(Four Character Code)を使用して指定します。 |
cv2.CAP_PROP_FORMAT | カメラ および 動画ファイル | フレームデータのフォーマットを取得します。 |
cv2.CAP_PROP_BRIGHTNESS | カメラ | 明るさを設定または取得します。 |
cv2.CAP_PROP_CONTRAST | カメラ | コントラストを設定または取得します。 |
cv2.CAP_PROP_SATURATION | カメラ | 彩度を設定または取得します。 |
cv2.CAP_PROP_HUE | カメラ | 色相を設定または取得します。 |
cv2.CAP_PROP_GAIN | カメラ | ゲインを設定または取得します。 |
cv2.CAP_PROP_EXPOSURE | カメラ | 露出を設定または取得します。 |
cv2.CAP_PROP_AUTOFOCUS | カメラ | オートフォーカスの有効/無効を設定または取得します。 |
cv2.CAP_PROP_SHARPNESS | カメラ | 鮮明度を設定または取得します。 |
cv2.CAP_PROP_ZOOM | カメラ | ズームを設定または取得します。 |
cv2.CAP_PROP_PAN | カメラ | パン(水平方向のカメラの位置)を設定または取得します。 |
cv2.CAP_PROP_TILT | カメラ | チルト(垂直方向のカメラの位置)を設定または取得します。 |
cv2.CAP_PROP_AUTO_EXPOSURE | カメラ | オート露出を設定または取得します。 |
cv2.CAP_PROP_POS_MSEC | 動画ファイル | 動画ファイルの現在の再生位置(ミリ秒単位)を取得または設定します。 |
cv2.CAP_PROP_POS_FRAMES | 動画ファイル | 動画ファイルの現在のフレーム位置を取得または設定します。 |
cv2.CAP_PROP_POS_AVI_RATIO | 動画ファイル | 動画ファイルの相対位置: 0 =「動画ファイルの先頭」、1 =「動画ファイルの終わり」。 |
cv2.CAP_PROP_FRAME_COUNT | 動画ファイル | 動画ファイル内の総フレーム数を取得します。 |
全てのプロパティーは公式のドキュメントで確認できます。
Webカメラのプロパティーの取得・設定をするサンプルコードが下になります。
import cv2 # Webカメラを開く cap = cv2.VideoCapture(0) # カメラが正常に開かれたかを確認します。 if not cap.isOpened(): print("カメラを開けませんでした。") exit() # 各種プロパティーの取得 # フレームの幅 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) print(f"Frame Width: {width}") # フレームの高さ height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) print(f"Frame Height: {height}") # フレームレート frame_rate = cap.get(cv2.CAP_PROP_FPS) print(f"Frame Rate: {frame_rate}") # fourcc fourcc = cap.get(cv2.CAP_PROP_FOURCC) print(f"FOURCC: {fourcc}") # フレームデータのフォーマット format = cap.get(cv2.CAP_PROP_FORMAT) print(f"Format: {format}") # 明るさ brightness = cap.get(cv2.CAP_PROP_BRIGHTNESS) print(f"Brightness: {brightness}") # コントラスト contrast = cap.get(cv2.CAP_PROP_CONTRAST) print(f"Contrast: {contrast}") # 彩度 saturation = cap.get(cv2.CAP_PROP_SATURATION) print(f"Saturation: {saturation}") # 色相 hue = cap.get(cv2.CAP_PROP_HUE) print(f"Hue: {hue}") # ゲイン gain = cap.get(cv2.CAP_PROP_GAIN) print(f"Gain: {gain}") # 露出 exposure = cap.get(cv2.CAP_PROP_EXPOSURE) print(f"Exposure: {exposure}") # オートフォーカスの有効/無効 autofocus = cap.get(cv2.CAP_PROP_AUTOFOCUS) print(f"Autofocus: {autofocus}") # 鮮明度 sharpness = cap.get(cv2.CAP_PROP_SHARPNESS) print(f"Sharpness: {sharpness}") # ズーム zoom = cap.get(cv2.CAP_PROP_ZOOM) print(f"Zoom: {zoom}") # パン pan = cap.get(cv2.CAP_PROP_PAN) print(f"Pan: {pan}") # チルト tilt = cap.get(cv2.CAP_PROP_TILT) print(f"Tilt: {tilt}") # オート露光 auto_exp = cap.get(cv2.CAP_PROP_AUTO_EXPOSURE) print(f"Auto Exposure: {auto_exp}") # 新しいフレームの幅と高さを設定 new_width = 640 new_height = 480 cap.set(cv2.CAP_PROP_FRAME_WIDTH, new_width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, new_height) # プロパティを再度取得して確認 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) print(f"New Frame Width: {width}") print(f"New Frame Height: {height}") # Webカメラから連続的にフレームをキャプチャ while True: ret, frame = cap.read() if not ret: break # フレームを表示 cv2.imshow("Small Frame Size: codevace.com", frame) # 'q'キーを押すとループを終了 if cv2.waitKey(1) & 0xFF == ord('q'): break # 後片付け cap.release() cv2.destroyAllWindows()
結果は以下の様になりました。
macOSにて、iPhoneをWebカメラとして使用した場合の結果ですが、”Brightness”〜"Auto Exposure"までのプロパティーは非対応の様で、”0.0”の値となりました。
Frame Width: 1920.0 Frame Height: 1080.0 Frame Rate: 30.0 FOURCC: 0.0 Format: 16.0 Brightness: 0.0 Contrast: 0.0 Saturation: 0.0 Hue: 0.0 Gain: 0.0 Exposure: 0.0 Autofocus: 0.0 Sharpness: 0.0 Zoom: 0.0 Pan: 0.0 Tilt: 0.0 Auto Exposure: 0.0 New Frame Width: 640.0 New Frame Height: 480.0
フレームのサイズを640x480とした映像が、以下となります。
正しく画像サイズが変更されていることが確認できました。
動画ファイルのプロパティーの取得をするサンプルコードが下になります。(get()関数のみ)
import cv2 # 動画ファイルを開く cap = cv2.VideoCapture("movie.mp4") if not cap.isOpened(): print("動画ファイルを開けませんでした。") exit() # 各種プロパティーの取得 # フレームの幅 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) print(f"Frame Width: {width}") # フレームの高さ height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) print(f"Frame Height: {height}") # フレームレート frame_rate = cap.get(cv2.CAP_PROP_FPS) print(f"Frame Rate: {frame_rate}") # fourcc fourcc = cap.get(cv2.CAP_PROP_FOURCC) print(f"FOURCC: {fourcc}") # フレームデータのフォーマット format = cap.get(cv2.CAP_PROP_FORMAT) print(f"Format: {format}") # フレーム数 total_count = cap.get(cv2.CAP_PROP_FRAME_COUNT) print(f"Frame Count: {total_count}") frame_count = 0 while cap.isOpened(): # フレームを1つ読み込む ret, frame = cap.read() frame_count += 1 # 動画の最後に到達したら終了 if not ret: break if frame_count == 1: # 最初のフレーム位置のビデオ全体の相対的な位置 pos_ratio = cap.get(cv2.CAP_PROP_POS_AVI_RATIO) print(f"Position Start: {pos_ratio}") if frame_count == total_count: # 最後のフレーム位置のビデオ全体の相対的な位置 pos_ratio = cap.get(cv2.CAP_PROP_POS_AVI_RATIO) print(f"Position End: {pos_ratio}") if frame_count == 550: # 現在の再生位置 pos_msec = cap.get(cv2.CAP_PROP_POS_MSEC) print(f"Position msec: {pos_msec}") # 現在の再生位置 pos_frames = cap.get(cv2.CAP_PROP_POS_FRAMES) print(f"Position Frames: {pos_frames}") # 中間地点のフレーム位置のビデオ全体の相対的な位置 pos_ratio = cap.get(cv2.CAP_PROP_POS_AVI_RATIO) print(f"Position Middle: {pos_ratio}") # リソースを解放して終了 cap.release()
このサンプルコードで実際に下の動画ファイルのプロパティーを取得しました。
使用した動画ファイル「ピンク、インク、ペイント」
引用元
https://pixabay.com/ja/videos/%E3%83%94%E3%83%B3%E3%82%AF-%E3%82%A4%E3%83%B3%E3%82%AF-%E3%83%9A%E3%82%A4%E3%83%B3%E3%83%88-91069/
結果は以下の様になりました。cv2.CAP_PROP_POS_AVI_RATIO
に関しては期待した値を取得することはできませんでした。
他の動画ファイルでも試してみましたが、同様に期待した値を得ることができませんでした。cv2.CAP_PROP_FOURCC
も正しい値ではなさそうです。
参考までに筆者の環境は下の通りです。
OpenCV ver 4.8.1
Python ver 3.11.1
異なる環境でも確認してみたいですね。
Frame Width: 960.0 Frame Height: 540.0 Frame Rate: 29.97002997002997 FOURCC: 875967080.0 Format: 0.0 Frame Count: 1101.0 Position Start: 3.3333333333333335e-05 Position msec: 18318.3 Position Frames: 550.0 Position Middle: 3.3333333333333335e-05 Position End: 3.3333333333333335e-05
おわりに
cv2.VideoCapture
クラスのget()
関数、set()
関数について解説しました。
公式ドキュメントを見ると、設定されているプロパティーが数多くありますが、特定の環境だけで使えるものが多い様です。
本記事では汎用的なプロパティーを選んで紹介させて頂きました。
ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。
参考リンク
cv::VideoCapture Class: get()
Returns the specified VideoCapture property.
cv::VideoCapture Class: set()
Sets a property in the VideoCapture.
■(広告)OpenCVの参考書としてどうぞ!■
(広告)おすすめ転職エージェント
転職はあなたの可能性を広げる鍵です。その鍵を手に入れるため、おすすめ転職エージェントを紹介します。
新しいキャリアの扉を開くために、転職エージェント活用して、妥協のない転職活動を行ってください。