03-3258-1238
03-3258-1238平日9:00 ~ 18:00(土日祝日除く)
OpenCVを用いて画像処理をする際に、一番初めに行う処理がカメラからの画像の取得です。 OpenCVを用いれば、USB接続したカメラからの画像取得はたった2つのコマンド実行できます。 Step1OpenCVのカメラの指定コマンド Step2OpenCVのカメラ画像の取得コマンド
本記事では、それぞれのコマンドの詳細、複数のカメラ接続時のカメラIDやDirect Show経由での取り込みなどの関連情報を解説します。
カメラの指定には、”cv2.VideoCapture”を使用します。 このコマンドは、指定するカメラのデバイスIDを、cv2.VideoCaptureの引数(次の数字)で指定することができます。 例えば、カメラを1台接続している場合、カメラのデバイスIDは0になるため、以下のように設定します。
cap = cv2.VideoCapture(0)
このコマンドを実行した際に、”cap”がカメラのオブジェクト名となり、カメラの設定を行ったり、このあとカメラの画像を取得する際に使用する名前になります。
この時、合わせて知りたいのが、デバイスIDをどう確認すれば良いかではないでしょうか。
デバイスIDは、カメラが認識された順番に”0”から順番に付与されます。よって、1台しか接続されていない場合は、デバイスIDは”0”になります。
複数のカメラが接続されている場合には、PCを再起動するとカメラを認識する順番が変わり、各カメラのデバイスIDが変わる可能性があるので注意が必要です。
カメラのデバイスIDの確認方法について、WindowsとLinux系についてそれぞれご紹介します。
カメラのデバイスIDは、デバイスマネージャーやコマンドプロンプトでは確認が出来ません。 実際に"cv2.VideoCapture"を実行して、「どのデバイスIDが有効になっているのか」、「どのデバイスIDにどのカメラの映像が映るか」ということを確認してください。
→外部リンク:複数カメラのカメラポート番号の確認
Linuxの場合は、v4l2(Video for Linux Two)というカメラを管理する統合インターフェースを使用して、各カメラのデバイスID、スペックの詳細の確認が可能です。
実行例 ※カメラのデバイスID確認方法
v4l2-ctl --list-devices
結果
UVC Camera: /dev/video0
→v4l2を使用したカメラデバイス情報の取得の詳細(準備中)
またLinuxでは、Pythonのプログラム内で「USBのポート情報」からカメラのデバイス IDを特定のに lsコマンド が有効です。 ポート情報から接続カメラのデバイスIDを認識する方法は、以下の記事をご参照ください。
→外部リンク:複数のWebカメラを使用する場合、USBポートの番号からデバイスを識別する
OpenCVの”cv2.VideoCapture”は、前述したように、カメラのデバイスIDでカメラを選択します。 よって、2台のカメラの画像を読み込む必要がある場合には、以下のようにカメラのオブジェクト名を cap0, cap1のように分けてそれぞれのIDを設定してください。
cap0 = cv2.VideoCapture(0) cap1 = cv2.VideoCapture(1)
カメラの画像取得には、”read()”を使用します。 read()コマンドの直前に、カメラのオブジェクト名を指定することで、どのカメラの画像を取得するかを指定することができます。
例えば、カメラのオブジェクト名が”cap”の場合には、以下のように実行します。
ret, frame = cap.read()
このコマンドを実行すると、第2戻り値である”frame”にカメラから取得した画像データが格納されます。 格納された画像データは各画素毎にRGBの値を持っている3次元の配列データになっているので、画像ファイルとして出力する他にも、Numbyなどを使用して配列データとして扱うこともできます。
”frame”の前にある”ret”には、画像の取得が成功したかどうかの結果が(True/Fales)の2値で格納されます。print(ret)を実行することで、取得が成功したかを表示することが可能です。
プログラム
ret, frame = cap.read() print(ret)
画像取得が成功した場合の表示
True
画像取得が失敗した場合の表示
False
"ret"の値がFalseになる場合には、カメラが正しく認識できているか確認してください。確認には、isOpend()コマンドの使用が有効です。
カメラが認識できていない原因としては、”cv2.VideoCapture”で存在しないカメラIDを指定しているなどが考えられます。
Python×OpenCVでカメラの画像取得を繰り返す際には、while文によるループを使用するのが一般的です。
ただし、while文のみではループから抜け出せなくなってしまいます。そこで、ループから抜けるために、while内にif文で、任意のキー(サンプルでは”ESC”キー)を押した場合にwhile文の外に抜けるコマンドを追加しておく必要があります。 以下にサンプルプログラムを紹介します。
import cv2 #カメラの設定 デバイスIDは0 cap = cv2.VideoCapture(0) #繰り返しのためのwhile文 while True: #カメラからの画像取得 ret, frame = cap.read() #カメラの画像の出力 cv2.imshow('camera' , frame) #繰り返し分から抜けるためのif文 key =cv2.waitKey(10) if key == 27: break #メモリを解放して終了するためのコマンド cap.release() cv2.destroyAllWindows()
・実行には、PythonとOpenCVをインストールしておく必要があります。 →Pythonのインストール方法(バージョンの選び方) →初めてのOpen CV(画像処理ライブラリ)ガイド
・imshow()は取得した画像データをディスプレイに表示するコマンドです。 →OpenCVを用いた画像の出力方法(準備中)
・カメラの設定を変えたい場合には、cv2.VideoCapture()コマンドとread()コマンドの間にカメラの設定コマンドを追加してください。 →カメラの設定を確認・変更する方法(解像度、明るさなど)
DirectshowはMicrosoftが提供しているビデオ(マルチメディア)を扱う際の様々なコンポーネントの集合体です。プログラムの要求に応じてビデオの加工、再生、録画、フォーマット変換などの処理を行うことができます。
Directshow経由でカメラの画像を読み込むことにより、以下のようなメリットがあります。
カメラのデバイスIDの後ろに”cv.CAP_DSHOW"を付加するだけで、DirectShow経由で画像を取得することが可能です。
cap0 = cv2.VideoCapture(0, cv2.CAP_DSHOW)
v4l2でカメラパラメータを確認
初めてのPythonガイド
初めてのOpenCVガイド
カメラの設定の確認・変更
カメラの設定Windowを簡単に出す
フレームレートの設定・確認方法
USBケーブルの延長方法
ハイスピードカメラとは
USBカメラの「ゲイン」設定
産業用カメラの選び方
KLV大学マシンビジョンコース