ケイエルブイは、ハイパースペクトルカメラ・光学部品・光源など世界中の光学機器を取り扱う専門商社です。

03-3258-1238

お問い合わせ
KLV大学 マシンビジョンコース

【Python×OpenCV】
カメラから画像を取得するコマンドcv2.readとは

OpenCVを用いて画像処理をする際に、一番初めに行う処理がカメラからの画像の取得です。
OpenCVを用いれば、USB接続したカメラからの画像取得はたった2つのコマンド実行できます。

Step1OpenCVのカメラの指定コマンド

Step2OpenCVのカメラ画像の取得コマンド

本記事では、それぞれのコマンドの詳細、複数のカメラ接続時のカメラIDやDirect Show経由での取り込みなどの関連情報を解説します。

OpenCVでのカメラ画像の取得

Step1 OpenCVで画像取得するカメラを選択する

カメラの指定には、”cv2.VideoCapture”を使用します。
このコマンドは、指定するカメラのデバイスIDを、cv2.VideoCaptureの引数(次の数字)で指定することができます。
例えば、カメラを1台接続している場合、カメラのデバイスIDは0になるため、以下のように設定します。

cap = cv2.VideoCapture(0)

このコマンドを実行した際に、”cap”がカメラのオブジェクト名となり、カメラの設定を行ったり、このあとカメラの画像を取得する際に使用する名前になります。

・カメラのデバイスIDの確認方法

この時、合わせて知りたいのが、デバイスIDをどう確認すれば良いかではないでしょうか。

デバイスIDは、カメラが認識された順番に”0”から順番に付与されます。
よって、1台しか接続されていない場合は、デバイスIDは”0”になります。

複数のカメラが接続されている場合には、PCを再起動するとカメラを認識する順番が変わり、各カメラのデバイスIDが変わる可能性があるので注意が必要です。

カメラのデバイスIDの確認方法について、WindowsとLinux系についてそれぞれご紹介します。

・Windowsの場合

カメラのデバイスIDは、デバイスマネージャーやコマンドプロンプトでは確認が出来ません。
実際に"cv2.VideoCapture"を実行して、「どのデバイスIDが有効になっているのか」、「どのデバイスIDにどのカメラの映像が映るか」ということを確認してください。

→外部リンク:複数カメラのカメラポート番号の確認


・Linux系の場合

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)


Step2 OpenCVのカメラの画像取得コマンド

カメラの画像取得には、”read()”を使用します。
read()コマンドの直前に、カメラのオブジェクト名を指定することで、どのカメラの画像を取得するかを指定することができます。

例えば、カメラのオブジェクト名が”cap”の場合には、以下のように実行します。

ret, frame = cap.read()

このコマンドを実行すると、第2戻り値である”frame”にカメラから取得した画像データが格納されます。
格納された画像データは各画素毎にRGBの値を持っている3次元の配列データになっているので、画像ファイルとして出力する他にも、Numbyなどを使用して配列データとして扱うこともできます。

・read()コマンドの第1戻り値”ret”とは

”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()コマンドの間にカメラの設定コマンドを追加してください。
 →カメラの設定を確認・変更する方法(解像度、明るさなど)



Direct Showを用いた画像の取得について

Direct Showとは

DirectshowはMicrosoftが提供しているビデオ(マルチメディア)を扱う際の様々なコンポーネントの集合体です。
プログラムの要求に応じてビデオの加工、再生、録画、フォーマット変換などの処理を行うことができます。

Direct Showを使用するメリット

Directshow経由でカメラの画像を読み込むことにより、以下のようなメリットがあります。

Direct Showの使用方法

カメラのデバイスIDの後ろに”cv.CAP_DSHOW"を付加するだけで、DirectShow経由で画像を取得することが可能です。

cap0 = cv2.VideoCapture(0, cv2.CAP_DSHOW)


用語集

マシンビジョンコース

ご質問・ご相談お気軽にお問い合せください

お電話でのお問合せ 03-3258-1238 受付時間 平日9:00-18:00(土日祝日除く)
Webでのお問い合わせ