Windows PCでPythonとOpenCVを使ってカメラ映像を表示する方法【初心者向け】

この記事は約10分で読めます。
スポンサーリンク

この記事では、Windows PCでPythonとOpenCVライブラリを使ってウェブカメラの映像を表示する方法を、初心者の方にもわかりやすく解説します。OpenCVは画像処理やコンピュータビジョンに特化した強力なライブラリで、カメラからの映像を扱うのに最適です。この記事を読めば、わずか数行のコードで簡単にカメラ映像を表示できるようになります。

必要なもの

  1. Python: まずはPython 3.x以降をインストールしましょう。Python公式ウェブサイトからダウンロードできます。
  2. OpenCV: Python用のOpenCVライブラリをインストールする必要があります。コマンドプロンプトやターミナルで以下のコマンドを実行してください。

    pip install opencv-python
  3. ウェブカメラ: パソコンに接続可能なウェブカメラが必要です。

前準備(セキュリティソフト対策)

セキュリティソフトがカメラへのアクセスをブロックしている可能性があります。プログラムを実行する前に、セキュリティソフトの設定でカメラへのアクセスを許可してください。
※私はこれに気が付かずずいぶんハマりました。
アクセス件がないと、以下のような警告が無限にでます。
最後の”-2147024891 ”がアクセス件がないというエラーに該当します。

[ WARN:0@18.696] global cap_msmf.cpp:1769 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147024891

プログラムの詳細

プログラムは大きく分けて2つのブロックに分かれています。

1. カメラデバイスのチェック:

  • デバイス探索: このブロックでは、プログラムはパソコンに接続されているカメラデバイスを検索します。0から9までのインデックス番号を順番に試して、利用可能なカメラデバイスを探します。
  • デバイス情報取得: 発見されたカメラデバイスについて、解像度、フレームレート、オートフォーカス、フォーカス値、オート露出、露出値、ISO感度などの情報を取得します。これらの情報はコンソールに出力され、どのカメラデバイスを使用するかを決める際に使用します。
  • デバイスリストの作成: 各カメラデバイスの情報を格納する辞書を作成し、リストに格納します。このリストは、ユーザーが使用するカメラデバイスを選択させます。

2. カメラのフレーム読み込みと出力:

  • デバイス選択: ユーザーにカメラデバイスのリストを表示し、使用するカメラデバイスを選択してもらいます。
  • フレーム読み込み: 選択されたカメラデバイスから連続的にフレームを読み込みます。
  • フレーム表示: 読み込んだフレームを cv2.imshow 関数を使ってウィンドウに表示します。
  • ループ終了: ユーザーが ‘q’ キーを押すとループを終了します。
  • リソース解放: cap.release 関数でカメラデバイスを解放し、cv2.destroyAllWindows 関数でウィンドウを閉じます。

プログラム全貌

import cv2
import time

def main():
  
    # 利用可能なデバイスを格納するリスト
    devices = []
    
    # 利用可能なデバイスを捜索
    for i in range(10):  
        cap = cv2.VideoCapture(i)

        # デバイスが存在し、開かれた場合
        if cap.isOpened():
           
            width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
            height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
            fps = cap.get(cv2.CAP_PROP_FPS)
            autofocus = cap.get(cv2.CAP_PROP_AUTOFOCUS)
            focus = cap.get(cv2.CAP_PROP_FOCUS)
            autoexposure = cap.get(cv2.CAP_PROP_AUTO_EXPOSURE)
            exposure = cap.get(cv2.CAP_PROP_EXPOSURE)
            iso_speed = cap.get(cv2.CAP_PROP_ISO_SPEED)

            # 情報を表示
            print(f"解像度: {width}x{height}")
            print(f"フレームレート: {fps}")
            print(f"オートフォーカス: {autofocus}")
            print(f"フォーカス値: {focus}")
            print(f"オート露出: {autoexposure}")
            print(f"露出値: {exposure}")
            print(f"ISO感度: {iso_speed}")
            cv2.waitKey(0)
            cap.release()
            
             # デバイスをリストに追加
            devices.append({
                "index": i,
                "width": width,
                "height": height,
                "fps": fps,
                # ... (その他のプロパティ)
            })
        else:
            pass
        
    cv2.destroyAllWindows()
    
    # スリープ処理を追加してデバイス解放を待つ
    time.sleep(1)  # 1秒間待つ
    
    # デバイスのリストを表示
    print("\n利用可能なデバイス:")
    for i, device in enumerate(devices):
        print(f"{i+1}. デバイス {device['index']}: 解像度 {device['width']}x{device['height']}, フレームレート {device['fps']}")

    # ユーザーにデバイスを選択させる
    choice = int(input("使用するデバイスを選択してください: ")) - 1

    if 0 <= choice < len(devices):
        # 選択されたデバイスのインデックスを取得
        selected_index = devices[choice]["index"]
    cap = cv2.VideoCapture(selected_index)
    
    while(True):
        ret, frame = cap.read()

        if ret == True:
            # フレームを表示
            cv2.imshow('Camera Feed', frame)

        # 'q'キーが押されたらループを終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break


    cap.release()
    cv2.destroyAllWindows()
    
if __name__ == '__main__':
    main()

プログラムの実行

  1. 上記のコードを camera.py などのファイル名で保存します。
  2. コマンドプロンプトやターミナルを開き、ファイルのあるディレクトリに移動します。
  3. python camera.py コマンドを実行します。
  4. 確認が終われば、「q」で終了です。

まとめ

この記事では、Windows PCでPythonとOpenCVを使ってウェブカメラの映像を表示する方法を解説しました。これで、あなたは自分のウェブカメラから映像を取得し、表示するプログラムを作成することができるようになりました。このプログラムは、OpenCVを使ってコンピュータビジョンアプリケーション開発を始めるための素晴らしい第一歩となります。

この記事が、あなたにとって役立つ情報になれば幸いです。

さらに深く学びたい方は、以下の関連情報もご参照ください。

ぜひ、この記事の内容を参考にして、あなた自身のカメラ映像処理プログラムを作ってみましょう!

Pythonの学習には、こちらを参考にしてみてください

コメント

タイトルとURLをコピーしました