OpenCVライブラリを使用して、PCカメラから動画を表示してみました。その方法について解説します。
サンプルプログラム
サンプルプログラムは以下のようになります。実行することでウィンドウが立ち上がり、PCカメラで映し出された動画で表示されます。「q」キーを押すことでウィンドウが閉じ、プログラムが終了します。
import cv2 as cv
WIDTH: int = 320
HEIGHT: int = 240
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
cap.set(cv.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, HEIGHT)
print("Width = ", cap.get(cv.CAP_PROP_FRAME_WIDTH))
print("Height = ", cap.get(cv.CAP_PROP_FRAME_HEIGHT))
while True:
# 1フレームずつ読み込む
ret, frame = cap.read()
# フレームが正しく読み込まれない場合
if not ret:
print("Can't receive frame")
break
# 読み込んだフレームを表示
cv.imshow("frame", frame)
#「q」キーが押されたらウィンドウを閉じる
if cv.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv.destroyAllWindows()
次項では、プログラム詳細を解説していきます。
VideoCaptureオブジェクトの取得
まず、VideoCapture()でVideoCaptureオブジェクトを取得します。
cap = cv.VideoCapture(0)
引数は、PCに接続されているカメラ番号になります。PCにカメラが1台しか接続されていない場合は「0」を指定します。
if not cap.isOpened():
exit()
もし、cap.isOpened()がFalseを返したならば、プログラムを終了するようにしています。
解像度の変更
openCVのデフォルトでは、解像度は640×480のようです。今回は320×240の解像度に変更しました。カメラの仕様により解像度は自由に変更することは出来ないので、自身がお持ちのカメラ仕様を調べて下さい。
解像度の幅と高さを指定して、指定した値が反映されているか確認しています。
WIDTH: int = 320
HEIGHT: int = 240
cap.set(cv.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, HEIGHT)
print("Width = ", cap.get(cv.CAP_PROP_FRAME_WIDTH))
print("Height = ", cap.get(cv.CAP_PROP_FRAME_HEIGHT))
cap.set()は動画のプロパティを設定するメソッドです。第1引数にプロパティ、第2引数に値を指定します。
cap.get()はプロパティを取得するメソッドです。第1引数にプロパティを指定します。
プロパティ | 説明 |
---|---|
CAP_PROP_FRAME_WIDTH | フレーム幅 |
CAP_PROP_FRAME_HEIGHT | フレーム高さ |
cap.read()で1フレームずつ読み込んだ画像をwhile文で繰り返し、動画にする
カメラから連続した画像を表示するため、cap.read()で読み込んだ画像をcv.imshow()で表示し、while文で繰り返します。
while True:
# 1フレームずつ読み込む
ret, frame = cap.read()
# フレームが正しく読み込まれない場合
if not ret:
print("Can't receive frame")
break
# 読み込んだフレームを表示
cv.imshow("frame", frame)
cv.waitKey(1)
cap.read()は2つの戻り値を返します。1つ目は、正しくフレームが読み込まれたかどうかTrue/FalseのBoolean値。2つ目は読み込んだ画像データです。
正しくフレームが読み込まれない場合は、while文を抜け、プログラムを終了させます。
フレームを読み込むだけでは、スクリーンに表示されないので、cv.imshow()で表示させます。cv.imshow()の第1引数は、表示させるフレームの名称を文字列で指定します。第2引数は、読み込む画像データを指定します。
cv.imshow()だけでは、処理が高速すぎてウィンドウは真っ黒のまま表示され、固まってしまいます。cv.waitkey(1)で1ms処理を待機させることで動画として表示出来るようにしています。
動画表示の終了
「q」キーが押されたらウィンドウを閉じるようにします。
while True:
#「q」キーが押されたらウィンドウを閉じる
if cv.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv.destroyAllWindows()
cv.waitKey()はキーが何も押されていないとき-1を返します。ここでは、「q」が押されたらwhile文を抜けるようにしています。
cap.release()でVideoCaptureオブジェクトを解放し、cv.destroyAllWindows()でウィンドウを閉じてプログラム終了です。
まとめ
今回は、PCカメラを使って動画を表示する方法を解説しました。
要点をまとめると
- VideoCaptureオブジェクトを取得する
- 解像度を変更する
- cap.read()で1フレームずつ読み込んだ画像をwhile文で繰り返し、動画にする
- 動画表示の終了