【Python+OpenCV】PCカメラを使って動画を表示しよう!

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文で繰り返し、動画にする
  • 動画表示の終了
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

大学で機械工学を学んだ後、製造業で働く40代の会社員です。
IT系、電気系を学んでこなかった機械系人間が、ゲーム制作、電子工作に奮闘してます。
極力低コストでものづくりを楽しむのがモットー。

目次