Amazon楽天で購入できるUSBカメラで、静止画の画像保存・動画撮影する方法をサンプルコード付きでご紹介します。PythonプログラムでOpenCVを利用します。
画像保存、動画撮影のほか、おまけで動画再生(音声なし)もご紹介します。
やること
・OpenCVのインストール
・USBカメラのフレームをキャプチャ
・画像保存
・フレーム表示
・動画保存
参考
・動画再生(音声なし)
テスト環境はWindows10、Python 3.10.11です。
テストに使ったUSBカメラはこちらです。
上記はたまたま過去に購入したものでして、新たに購入するなら次の製品も安価でおすすめです。
それでは順に見ていきましょう!
やること
OpenCVのインストール
OpenCVはオープンソースのコンピュータビジョンライブラリで、画像と動画の処理に特化しています。
コンピュータビジョンタスクを簡単に実現でき、画像処理、物体検出、顔認識、機械学習など幅広いアプリケーションに使用されます。
豊富な関数とモジュール、プラットフォームのサポート、高速な処理能力を提供し、研究、開発、プロトタイピングに不可欠なツールとして広く利用されています。
今回はOpenCVの力を借りまくって簡単に実装したいと思います。
ということでまずはインストールしましょう。
pip install opencv-python
USBカメラのフレームをキャプチャ
USBカメラを接続して画像をキャプチャします。
静止画は1回だけ、動画は繰り返しキャプチャします。
キャプチャするための前設定をします。
import cv2
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
cv2.VideoCapture(0)
の引数は概ね0~9の値です。
例えばノートPCでテストするケースだと、備え付けのカメラが0番を使用していることがあります。
その場合はUSBカメラを利用するには1番を指定する必要があります。
ret, frame = cap.read()
: cap.read()
メソッドを使用してカメラからフレームをキャプチャします。ret
はキャプチャが成功したかどうかを示すブール値で、frame
はキャプチャしたフレームの画像データです。ret
の値を見て、キャプチャできた場合と失敗した場合の処理を分けられるってことですね。
画像保存
先ほど取得したframe
を画像ファイル出力します。
import cv2
if ret:
cv2.imwrite('captured_photo.jpg', frame)
cv2.imwrite()
関数を使用してキャプチャしたフレームを画像ファイルに保存します。
ファイル名はcaptured_photo.jpg
としました。必要に応じて変更できます。
これで静止画の画像保存ができるようになりました。
フレーム表示
次は動画撮影して保存してみたいと思います。
まずはリアルタイムでUSBカメラに写った内容をフレーム表示してみましょう。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
# フレームを表示します。
cv2.imshow('USB Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
新たに追加されたのはwhile構文とcv2.imshow('USB Camera', frame)
ですね。
cv2.imshow()
関数を使用して、キャプチャしたフレームを指定したウィンドウに表示します。
ウィンドウのタイトル名を 'USB Camera'
としています。
その処理をwhileで繰り返し、cv2.waitKey()
関数でキーボード入力を待機し、’q’キーが押されたら撮影ループを終了します。
実行するとこのようにフレーム表示されます。
動画保存
ここまでができたら動画の保存ですね。
後ほどサンプルコードの形にしますので、ここでは必要部分のみ説明したいと思います。
import cv2
cap = cv2.VideoCapture(0)
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
fps = int(cap.get(cv2.CAP_PROP_FPS))
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, (frame_width, frame_height))
撮影するための前設定です。
ウィンドウの幅・高さ・フレームレートを取得し、動画ファイルを書き込むためのオブジェクトを生成します。
while True:
ret, frame = cap.read()
if ret:
# フレームを動画に書き込みます。
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 後処理
cap.release()
out.release()
動画の書き込み部分です。フレーム表示とほぼ同じです。
違っているのがout.write(frame)
です。
これで動画ファイルに書き込んでいきます。
サンプルコード_画像保存
それでは、これまで見てきたコードを合体させてサンプルコードにしてみましょう。
import cv2
cap = cv2.VideoCapture(0) # 0はデフォルト。複数のカメラが接続されている場合は1、2、3などを試してください。
# フレームをキャプチャします。
ret, frame = cap.read()
if ret:
# フレームを保存します。
cv2.imwrite('captured_photo.jpg', frame)
print('写真を保存しました。')
# カメラを解放します。
cap.release()
サンプルコード_動画撮影
実行すると、実行ファイルと同じ階層に'output.mp4'
を生成します。
動画撮影時はフレーム表示され、リアルタイムに撮影内容をチェックできます。
import cv2
# USBカメラをキャプチャするためのキャプチャオブジェクトを作成します。
cap = cv2.VideoCapture(0) # 0はデフォルトのカメラデバイスを指します。複数のカメラが接続されている場合は1、2、3などを試してください。
# 動画の設定を指定します。
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
fps = int(cap.get(cv2.CAP_PROP_FPS))
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, (frame_width, frame_height))
while True:
# フレームをキャプチャします。
ret, frame = cap.read()
# フレームの取得が成功した場合
if ret:
# フレームを表示します。
cv2.imshow('USB Camera', frame)
# フレームを動画に書き込みます。
out.write(frame)
# 'q'を押すとループを終了します。
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 後処理
cap.release()
out.release()
cv2.destroyAllWindows()
サンプルコード_動画再生(音声無し)
実はここまでの説明で動画再生(音声無し)もできてしまいます。
下記はそのサンプルコードです。1000 // desired_frame_rate
でfpsから再生速度を求めて繰り返し処理しています。desired_frame_rate = int(cap.get(cv2.CAP_PROP_FPS))
で動画ファイルに設定されたfpsを取得しています。
import cv2
# 動画ファイルのパスを指定します。
video_path = 'output.mp4'
# 動画を再生するためのキャプチャオブジェクトを作成します。
cap = cv2.VideoCapture(video_path)
# フレームレートを取得します。
desired_frame_rate = int(cap.get(cv2.CAP_PROP_FPS))
cap.set(cv2.CAP_PROP_FPS, desired_frame_rate)
while True:
# フレームをキャプチャします。
ret, frame = cap.read()
if ret:
# フレームを表示します。
cv2.imshow('Video Playback', frame)
# 'q'を押すとループを終了します。
if cv2.waitKey(1000 // desired_frame_rate) & 0xFF == ord('q'):
break
else:
break
# 後処理
cap.release()
cv2.destroyAllWindows()
以上になります。
この記事が少しでもお役に立てれば幸いです。
それでは読んで頂きありがとうございました!