接続中のカメラ番号を抽出する 【OpenCV & Python】

programming Python

パソコンに接続してある USB カメラのカメラ番号を抽出する Python のスクリプトについてまとめておきます。

以下の環境で動作確認をしています。
環境1: Windows パソコン、USB カメラ(Python 3 と OpenCV の設定・インストール済み)
環境2: Raspberry Pi、USB カメラ(Python 3 と OpenCV の設定・インストール済み)

背景 ~ カメラ番号を確認したい!

Python で OpenCV を使うと、画像処理などが比較的簡単に実行できます。
手元に USB カメラがあれば、ライブ画像でのバーコードの読み取りや顔画像の検出なども可能です。

しかし、Python や OpenCV の設定を終え、USB カメラを動かそうとすると、プログラム上で設定する必要のあるカメラ番号(デバイスID、index)は、USB カメラを刺したポートの位置により変化します。
何番に設定したらよいのか、プログラム側からは明確ではありません。

また、USB カメラやパソコンの新旧が異なると、そもそも、そのカメラとパソコンの組み合わせで、ハードウェアが正常に動くのかすらわかりません。

ということで、パソコンに 接続されているカメラのデバイス番号(ポート番号)を簡単に確認できる Python のスクリプトをまとめ、公開しておくことにします。

Web カメラが複数接続されているときであっても、カメラが認識できているかどうか、また、デバイス番号がどうなっているか、簡単に確認できます。たとえば、ノートパソコンの内蔵カメラと USB ポートに接続した Web カメラが、2台同時に接続されているとき、両方のカメラ番号を確認できます。
なお、スクリプトは、環境依存となりうる余計な記載はできるだけなくし、最小限の知識・手間で使いまわせるよう、まとめておくことにします。

サンプルコード:カメラ番号の検出 camera_detector1.py

import cv2

for i1 in range(0, 20): 
    cap1 = cv2.VideoCapture( i1, cv2.CAP_DSHOW )
    if cap1.isOpened(): 
        print("VideoCapture(", i1, ") : Found")
    else:
        print("VideoCapture(", i1, ") : None")
    cap1.release() 

使い方

① camera_detector1.py 等のファイル名でテキストファイルを作成して上記のスクリプトをコピー&ペーストして保存してください。
② USB ポート等にカメラを接続し、コマンドプロンプトから①のスクリプトを実行してください。
カメラが動作していると、カメラ番号とともに、”Found” と示されます。カメラは20台(0, 1, …, 19)までチェックするようにしています。必要により修正してください。

まとめ

Python の OpenCV を使って、接続中のカメラ番号を抽出するサンプルコードをまとめました。

OpenCV で関数 cv2.VideoCapture() を使ってプログラミングをする際、カメラ番号の確認に使用できます。
また、古い USB カメラがあったときに有効活用できそうか、Windows だけでなく Linux でも使えるかなど、確認する際にも使えます。
カメラ番号が検出できているのであれば、そのまま動くと思います。

※ 私の事例では、10年くらい前に買った USB カメラを接続して上記のスクリプトを実行してみたところ、Raspberry Pi (Linux) では認識できて、カメラも正常に動きました。しかし、Windows 10 パソコンでは、カメラの認識自体ができなくなっていました。そこで、古いカメラは Raspberry Pi 専用で使うことにし、Windows 用としては追加で、新しい USB カメラを購入しました(下記)。
なお、OpenCV などの画像処理用に新たにカメラを購入されるのであれば、プログラムが動かないときに原因特定が簡単となるよう、ピント合わせが可能なカメラ(マニュアルフォーカスかオートフォーカスのもの)をお勧めします。最近、固定焦点のカメラが増えており、撮影時の倍率を上げようとしてもカメラ近くにピント合わせができない製品が増えている印象があるためです。

関連リンク
・ USB カメラ 購入レポート【おすすめ、画像処理】
・ バーコードリーダー 【Python & tkinter】
・ 顔認識ソフトウェア 【OpenCV】
・ Raspberry Pi で物体検出をやってみた
・ OpenCV の動作確認用サンプルコード 【Python & USB カメラ】

外部リンク
・ OpenCV の仕様: OpenCV cv::VideoCapture Class Reference 

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