Webカメラ
前回、複数のリストの順番を同時にソート(並び替え)する方法を紹介しました。
今回はWebカメラを使って画像を取得したり、動画を録画したりする方法を紹介します。
それでは始めていきましょう。
OpenCVのインストール
Webカメラの画像を取得したり、動画を録画するには「OpenCV」というライブラリが必要になります。
ということでOpenCVをpipでインストールします。
pip install opencv-python
Webカメラの画像を取得
それではWebカメラの画像を取得してみましょう。
ここではあくまでもWebカメラに写っているものを画面上に表示するだけですので注意してください。
プログラム全体としてはこんな感じです。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow('Title', frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
まずは「import cv2」でOpenCVのインポート。
「cv2.VideoCapture(0)」はWebカメラの指定をしています。
どのカメラにどの番号が振られているかはとりあえず試してみて確認するのがいいでしょう。
「while True:」以下が画像を取得し、表示する部分になります。
「ret, frame = cap.read()」で画像を取得し、変数retとframeに情報を格納します。
retには画像が取得できたかどうかがbool値(True/False)で格納されています。
画像はframeに格納されており、次の「cv2.imshow(‘Title’, frame)」で「Title」という名前のウインドウを開き、画像が表示されます。
「cv2.waitKey(1)」はキーボードを押されるのを待つコマンドで括弧内はミリ秒です。
つまり「cv2.waitKey(1)」なら1ミリ秒キーボードの入力を待つということになります。
そして「key = cv2.waitKey(1)」とすることでキーボード入力があった際、その値が変数keyに格納されます。
そして「if key == ord(‘q’):」、つまりキーボードで押されたキーが「q」だった場合、「break」、つまり終了するというわけです。
また「ord」は文字をUnicodeに変換するための関数らしく、私の環境ではこれが無いと「q」を押しても終了しませんでした。
最後の「cap.release()」はカメラを閉じる、そして「cv2.destroyAllWindows()」はウインドウを閉じるコマンドです。
ちなみに終了に関しては、私のMacではフリーズしてしまい、うまく終了できませんでした。
また解消したら別記事で解説したいと思います。
Webカメラで動画を録画する方法
それでは今度はWebカメラの動画を録画してみましょう。
プログラムとしてはこんな感じ。
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
video = cv2.VideoWriter('video.avi', fourcc, 20, (width, height))
while True:
ret, frame = cap.read()
cv2.imshow('Title', frame)
video.write(frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
追加されたのはこちらの2つの部分。
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
video = cv2.VideoWriter('video.avi', fourcc, 20, (width, height))
video.write(frame)
2つ目の部分は「While True:」内にありますが、これは動画を記録するコマンドです。
問題は最初の部分。
上から「cap.get(cv2.CAP_PROP_FRAME_WIDTH)」の「cap.get()」はカメラの情報を取得するコマンドです。
そしてその引数として「cv2.CAP_PROP_FRAME_WIDTH)」や「cv2.CAP_PROP_FRAME_HEIGHT)」がありますが、前者はカメラ画像の幅を取得し、後者は高さをピクセル単位で取得します。
「cv2.VideoWriter_fourcc(‘M’, ‘J’, ‘P’, ‘G’)」はファイル形式でどんなファイル形式が使えるかはこちらの記事が詳しいので見てみてください。
WindowsかMacかでも使えるファイル形式が違うでしょうし、インストールしてあるソフトウェア(コーデック)でも違うので、とりあえずmp4やaviあたりから試していくのがいいのではないでしょうか。
そして次の「cv2.VideoWriter(‘video.avi’, fourcc, 20, (width, height))」で書き込むファイルの設定をします。
「cv2.VideoWriter(ファイル名, ファイル形式, fps, (動画の幅, 動画の高さ))」です。
ファイル形式は先ほどの「cv2.VideoWriter_fourcc(‘M’, ‘J’, ‘P’, ‘G’)」を関数に格納したものを渡します。
fps(フレームレート)はカメラによってですが、いくつかのウェブサイトでは「cap.get(cv2.CAP_PROP_FPS)」で取得していましたが、私の環境では数値を入れないと正確に動きませんでした。
これで「video.write(frame)」をWhile文の中に記述することで、動画を保存することができます。
画像が扱えるようになると例えばリアルタイムでAI処理なんかができるそうです(私ができるとは言っていません)。
次回はsysモジュールを使ってコマンドライン引数を取得する方法を紹介します。
ではでは今回はこんな感じで。
コメント