デバイスオープンとデバイス情報の取得

概要

カメラのデバイスオープンとデバイス情報の取得は、UVCカメラや産業用カメラを利用する上で基本となるステップです。例えば、リアルタイムでの顔認識や物体検知などのアプリケーションでは、まずカメラを開き、そのデバイスからのビデオストリームを取得する必要があります。アプリケーションに応じた解像度・フレームレートに設定することによって最適なパフォーマンスのアプリケーションを構築することができます。

補足:カメラとデバイスオープン

一般的にカメラのデバイスオープンとは、PCからカメラに対してハンドリングを開始する様なステップを言います。 制御の方法は様々ですが、最初に命令だけをカメラに送信し、PC側は流れてくるフレームを受けるだけの場合や、 逐次的な双方向通信を行い、制御やお互いの存在確認を行う様な制御方法が挙げられます。
この記事ではOpenCVのUVCカメラ制御用APIを利用して、The Imaging Source社のUSBカメラDFK33シリーズの制御を行っています。

出力結果

カメラを開きました

プログラム全体

#解説1 import cv2 #解説2 # ID 0のデバイスを開く cap = cv2.VideoCapture(0) # ユーザーが選択したカメラが正常に開かれたかどうかを確認する。 if not (cap.isOpened()): print('カメラを開けませんでした') else: print('カメラを開きました') #解説3 # カメラを解放する cap.release()

解説

解説1: モジュールのインポート

import cv2

最初に行うのは、必要なライブラリのインポートです。このコードでは、cv2という名前でOpenCVライブラリをインポートしています。OpenCVは、UVCカメラの制御だけでなく画像処理や機械学習なども行えるオープンソースのライブラリです。
OpenCVとは?

解説2: カメラのオープン

# ID 0のデバイスを開く cap = cv2.VideoCapture(0) # ユーザーが選択したカメラが正常に開かれたかどうかを確認する。 if not (cap.isOpened()): print('カメラを開けませんでした') else: print('カメラを開きました')

ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCaptureオブジェクトを返しています。ここでの引数0は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なります。 また、カメラが正常に開かれたかどうかも確認しています。cap.isOpened()は、カメラが正常に開かれていればTrueを、そうでなければFalseを返します。もしデバイスが開けなかった場合(例えば、指定したIDのデバイスが存在しない場合など)、エラーメッセージを出力します。

補足:OpenCVにおけるデバイスID

デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。 TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html

解説3: カメラを解放する

# カメラを解放する cap.release()

最後に、cap.release()を呼び出してカメラを解放します。これは、カメラを開いた後、それを適切に閉じることでシステムリソースを解放するために必要です。これを行わないと、プログラムが終了した後もデバイスが開いたままになり、他のプログラムがそのデバイスを使用できなくなる可能性があります。

応用