ライブ表示とフレームレートの制御/解像度の制御
概要
この記事ではOpenCVを使用して、UVCカメラの映像をPCの画面上でライブ表示するためのコードと簡単な解説を行っています。 その中で、ライブ表示に重要な2つのパラメータ(フレームレートと解像度)について合わせて説明しています。 ライブ表示は言葉の通り、カメラの写っている映像をPC画面にリアルタイムで表示する事です、一般的にも多く使われる機能で、様々な目的で使用されています。
補足:フレームレート/解像度
- フレームレート(fps)は映像や動画が1秒当たりに何枚のフレーム(画像)で構成されているかを表す単位です。例えば100fpsであれば1秒間に100枚の画像で構成されています。人の目だと30fpsを下回るとカクカクとしたぎこちない映像に見えることがあります。 カメラの性能の場合は1秒間に撮影できる画像の枚数を表しています。
- 解像度は画像が縦横何ピクセルで構成されているかを表しています。よく使われる解像度では1920×1080(FullHD)や3840×2160(4K)等の組合せがあります。 解像度自体はピクセルの数なので画質(画像の品質)とは異なる表現で使われることが多いです。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# カメラの設定
cap = cv2.VideoCapture(0)
#解説3
# フレームレートの設定
fps = 30.0
#解説4
width, height = 640, 480
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
cap.set(cv2.CAP_PROP_FPS, fps)
#解説4
while(cap.isOpened()):
ret, frame = cap.read()
# フレームを表示する
cv2.imshow('camera', frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#解説5
# キャプチャをリリースしてウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
解説
解説1: ライブラリのインポート
import cv2
PythonのOpenCVライブラリをインポートしています。OpenCVは、画像処理やコンピュータビジョンに関する機能を提供するオープンソースのライブラリです。このライブラリをインポートすることで、後のコードでOpenCVの機能を使うことができます。例えば、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を簡単に利用することができます。
解説2: カメラの設定
cap = cv2.VideoCapture(0)
ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)
という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCapture
オブジェクトを返しています。0
は、通常はシステムに接続されているデフォルトのカメラ(ノートパソコンの内蔵カメラ等)を指しており、複数のカメラが接続されているシステムでは、OSの認識順で番号が割り振られます。
補足:OpenCVにおけるデバイスID
デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。
TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html
解説3: フレームレートと解像度の設定
fps = 30.0
width, height = 640, 480
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
cap.set(cv2.CAP_PROP_FPS, fps)
ここではデバイスのフレームレートと解像度を設定しています。
cap
は解説2で出てきたUVCカメラオブジェクトです、それらにset.(パラメータ名,値)
を与えることでカメラの設定をコントロールする事ができます。
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
で横解像度(640pixel)を、cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
で縦の解像度(480pixel)を設定しており、cap.set(cv2.CAP_PROP_FPS, fps)
で、フレームレートを30.0fps(フレーム/秒)に設定しています。
補足:OpenCVでコントロールできる設定値
OpenCVはオープンソースのライブラリの為、カメラやそのメーカーから見るとサードパーティーのライブラリです、なのでカメラの設定値を必ずコントロールできるという訳ではなく、カメラやメーカーによって対応している範囲が異なるので、利用する際には確かめる必要があります。
以下のようにカメラメーカーが出しているライブラリを併用する事で、より高度かつ簡易に画像処理を行う事ができるのでお勧めです。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-device.html
解説4: メインループ
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.isOpened()
を使用してデバイス状態を確認し、ここではカメラが正常に開いている間while文でループ処理をしています。ループ処理の中で、 cap.read()
でカメラから1フレームを読み込み、cv2.imshow('camera', frame)
で読み込んだフレームを画面に表示します。
cap.read()
ではフレーム取得と同時に、ret
にフレームの読み込みが成功したかどうかを示すTrue/FalseのBoolean値も取得しています。
cv2.imshow('camera', frame)
のcamera
は表示ウィンドウの名前で、最終的に& 0xFF == ord('q')
の部分で、入力されたキーが'q'であればループを抜ける(プログラムを終了する)ようにしています。
解説5: リソースの解放
cap.release()
cv2.destroyAllWindows()
ここでは、使用が終わったリソースを適切に解放しています。
まず、 cap.release()
はプログラムが終了した際にリソースのリークを防ぐためにカメラデバイスを解放します。この呼び出しを忘れると、カメラが他のプログラムから使用できなくなる可能性があります。
最後にcv2.destroyAllWindows()
は、OpenCVで開かれた全てのウィンドウを閉じます。