【Python・OpenCV】カメラや動画ファイルのプロパティーの取得・設定をするには(get(), set())

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

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

【Python・OpenCV】カメラや動画ファイルのプロパティーの取得・設定をするには(get(), set())

はじめに

cv2.VideoCaptureを使ったWebカメラと動画ファイルから画像の取得して保存する方法を下の記事で紹介しました。

これらの記事では、特に説明をしていなかったcv2.VideoCaptureで取得、設定できるプロパティーについて解説します。

cv2.VideoCaptureのプロパティは、カメラまたは動画ファイルの動作や設定を制御するためのパラメータです。
カメラのプロパティを使用すると、さまざまな設定(解像度やフレームレートの設定、明るさやコントラストの調整、フォーカスの制御など)を制御できます。
また、動画ファイルでは解像度ややフレームレート、動画ファイル内の総フレーム数などの情報を取得したり、再生位置を制御したり、ビデオファイルに関する詳細な設定を行ったりすることができます。

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

プロパティーを取得するget()関数

cv2.VideoCaptureクラスのget()関数は、カメラまたは動画ファイルから設定値を取得するために使用されます。

get(propId)

引数

名称説明
propId(必須)VideoCapturePropertiesで定義されている識別子

戻り値

指定されたプロパティの値。cv2.VideoCaptureクラスでサポートされていないプロパティを指定すると、0 が返されます。

プロパティーを設定するset()関数

cv2.VideoCaptureクラスのset()関数は、カメラまたは動画ファイルの設定を変更するために使用されます。
引数や戻り値は下の通りとなります。

set(propId, value)

引数

名称説明
propId(必須)VideoCapturePropertiesで定義されている識別子
value(必須)プロパティーに設定する値

戻り値

cv2.VideoCaptureクラスでサポートされているプロパティを指定すると、True が返されます。

注意

戻り値が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動画ファイル動画ファイル内の総フレーム数を取得します。
代表的なVideoCaptureProperties

全てのプロパティーは公式のドキュメントで確認できます。

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()関数について解説しました。
公式ドキュメントを見ると、設定されているプロパティーが数多くありますが、特定の環境だけで使えるものが多い様です。
本記事では汎用的なプロパティーを選んで紹介させて頂きました。

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

参考リンク

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

(広告)おすすめ転職エージェント

転職はあなたの可能性を広げる鍵です。その鍵を手に入れるため、おすすめ転職エージェントを紹介します。

新しいキャリアの扉を開くために、転職エージェント活用して、妥協のない転職活動を行ってください。

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