皆さん、こんにちは!
上越市を拠点にし、「FA設備・装置開発」と「画像処理」に強い会社、NSIです!
私達は豊富な経験と専門知識で、各種業界の自動化・システム化のお手伝いをしています。
暑い日が続いていますが、皆さんいかがお過ごしでしょうか?
会社によっては納涼会が開催される時期ですね。
暑さで疲れた体に冷えたビールの組み合わせ… 体に染みますね!
(くれぐれも飲み過ぎにはご注意を!)
今回は、PythonでWebカメラの映像を取得してみました。
面倒な画像処理もOpenCVを使えばわずか数十行で実装可能!
ぜひご覧ください。
通常のカメラ撮影とPythonでの取得の違い
まず、通常のカメラで撮影した場合、単純に映像が保存されるだけで、その後の処理は別途行う必要があります。一方、Pythonでカメラ映像を取得する場合、リアルタイムで様々な処理を行うことができるため、以下の利点が得られます。
内容 | 詳細 |
---|---|
① リアルタイム処理 | 映像を取得しながら、リアルタイムで画像処理を行うことができます。 |
② 対話型システム | ユーザーの動作や表情と連動した対話型アプリケーションを作成できます。 |
③ 効率的な分析 | リアルタイムで映像を解析することで、あとから処理する手間を省くことができます。 |
活用例
Pythonの利点を踏まえて、活用事例を考えてみましょう。
リアルタイムで画像処理を行えるため、様々な場面で活用が可能です。
1. バーチャルリアリティ(VR)技術への応用
映像を撮影しながら、仮想現実のアプリでユーザーの動作とトラッキング(連動)させることができます。
2. 表情認識による反応
ユーザーの表情を認識し、それに応じてシステムの動作を変えることができます。
3. 動作分析の効率化
映像をリアルタイム解析し、特定の動作を行った際に通知やアラートを発生させることができます。
Webカメラの映像を取得してみる
今回は「OpenCV」というライブラリを使用していきます。
早速実装していきましょう!
OpenCVのインストール
コマンドプロンプトから以下のコマンドを実行します。
※ 以下はPythonがインストールされている場合のコマンドです。別の開発環境(Anaconda)等を使っている場合は、それに合わせて変更してください。
pip install opencv
補足:OpenCVとは?
インテルが開発・公開したオープンソースのライブラリ。
画像処理/解析、機械学習を行うことができ、一般的なほとんどのOSで使用可能で、幅広い開発言語に対応。
使用できるOS … Windows, Linux, macOS, Android, iOS など
使用できる言語 … C++, Java, Python, C#, MATLAB など
公式サイトはこちら → https://opencv.org/
処理の作成
続いて処理を作成していきます。
今回の完成イメージは以下のような画面です。
まずは、使用するライブラリを呼び出します。
今回使用するのは3つのライブラリで、それぞれコメントに記載した用途で使用します。
datetime、time ライブラリはPythonのインストール時にデフォルトで含まれているライブラリのため、追加のインストールは不要です。
import cv2 # 撮影するライブラリ
import datetime # 現在時刻を取得するライブラリ
import time # 時間を計測するライブラリ
接続するカメラのデバイス番号を指定します。
Webカメラのデバイス番号は基本的に0ですが、複数のカメラが接続されている場合やうまく認識できない場合は、番号を変更してみてください。
# 使用するカメラのデバイス番号を指定(通常は0)
cap = cv2.VideoCapture(0)
動画の保存設定を行います。
録画した動画の保存形式や変数を定義します。
# 動画保存設定
dt = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # ファイル名
codec = cv2.VideoWriter_fourcc(*"mp4v") # コーデック
out = None # 保存する動画
start_time = 0 # 録画開始時間
recording = False # 録画フラグ
撮影部分を作成していきます。
whileループを使うことで、カメラ映像が途切れることなく連続でのキャプチャが可能です。
# 撮影開始
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cap.isOpened()で、カメラに正常にアクセスできるか確認し、cap.read()で、カメラから1フレームを撮影します。
cap.read()では以下2つの戻り値が返ってきます。これを元に撮影が成功したかを判断し、失敗した場合はループから抜け、成功した場合は次の処理へ続きます。
変数 | 詳細 |
---|---|
ret | 1フレームの撮影が成功したかどうか |
frame | 撮影した1フレーム |
しばらく、Whileループの中に処理を記載していきます。
これは画面上に表示する操作の補助テキストです。
# 操作説明
cv2.putText(frame, f"[s]:Start REC", (5, 430), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
cv2.putText(frame, f"[e]:End REC", (5, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
cv2.putText(frame, f"[q]:Quit", (5, 470), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
動画の保存と、録画秒数を画面に表示します。
# 録画が開始されたらフレームを動画として保存
if recording:
out.write(frame)
elapsed_time = time.time() - start_time
elapsed_str = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
cv2.putText(frame, f"REC:{elapsed_str}", (5, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)
録画を開始した際にrecordingフラグをTrueとすることで、この処理が実行されます。(録画開始処理は後述)
out.write(frame)で撮影したフレームをファイルに書き込みます。
elapsed_timeで、録画の経過時間を算出し、cv2.putTextで画面上に表示します。
現在カメラに映っている画像をウィンドウで表示します。
# フレームを表示
cv2.imshow('Frame', frame)
アプリケーション起動中に押されたキーを取得し、それに応じた処理を実施します。
この処理で、Whileループ内の処理は完了です。
# キー取得
key = cv2.waitKey(1) & 0xFF
# 録画開始:キーが[s] かつ 録画していない
if key == ord('s') and not recording:
out = cv2.VideoWriter(f"{dt}.mp4", codec, 20.0, (640, 480))
recording = True
start_time = time.time()
print("録画を開始しました。")
# 録画終了:キーが[e] かつ 録画中
elif key == ord('e') and recording:
recording = False
out.release()
print("録画を終了しました。")
# アプリ終了:キーが[q]
elif key == ord('q'):
print("アプリを終了しました。")
break
キー | キーを押した際の処理 |
---|---|
[s] | ・動画の保存先を指定 ・recordingフラグをTrue ・録画開始時間を記録 |
[e] | ・recordingフラグをFalse ・動画ファイルへの書き込みを終了 |
[q] | ・whileループから抜ける |
最後に、リソースを解放し、ウィンドウを閉じます。
# 後片付け
cap.release()
if out:
out.release()
cv2.destroyAllWindows()
以上で処理は完了です。
それでは実行してみましょう!
処理の実行
実際に録画できるか試してみましょう!
バッチリ映っていますね。
保存された動画の再生も、問題なく行えました!
付録. ソースコード全文
今回作成したソースコード全文です。
OpenCVをインストールし、以下のソースコードをコピペすれば実行できます。
(デバイス番号はPCによって変わる可能性があるため、必要に応じて変更してください。)
import cv2 # 撮影するライブラリ
import datetime # 現在時刻を取得するライブラリ
import time # 時間を計測するライブラリ
# 使用するカメラのデバイス番号を指定(通常は0)
cap = cv2.VideoCapture(0)
# 動画保存設定
dt = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # ファイル名
codec = cv2.VideoWriter_fourcc(*"mp4v") # コーデック
out = None # 保存する動画
start_time = 0 # 録画開始時間
recording = False # 録画フラグ
# 撮影開始
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 操作説明
cv2.putText(frame, f"[s]:Start REC", (5, 430), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
cv2.putText(frame, f"[e]:End REC", (5, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
cv2.putText(frame, f"[q]:Quit", (5, 470), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
# 録画が開始されたらフレームを動画として保存
if recording:
out.write(frame)
elapsed_time = time.time() - start_time
elapsed_str = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
cv2.putText(frame, f"REC:{elapsed_str}", (5, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)
# フレームを表示
cv2.imshow('Frame', frame)
# キー取得
key = cv2.waitKey(1) & 0xFF
# 録画開始:キーが[s] かつ 録画していない
if key == ord('s') and not recording:
out = cv2.VideoWriter(f"{dt}.mp4", codec, 20.0, (640, 480))
recording = True
start_time = time.time()
print("録画を開始しました。")
# 録画終了:キーが[e] かつ 録画中
elif key == ord('e') and recording:
recording = False
out.release()
print("録画を終了しました。")
# アプリ終了:キーが[q]
elif key == ord('q'):
print("アプリを終了しました。")
break
# 後片付け
cap.release()
if out:
out.release()
cv2.destroyAllWindows()
最後に
今回は、PythonでWebカメラの映像を取得する方法 を調査してみました。
これを応用して、色々なアプリケーションが作れそうですね。
皆さんもぜひお試しください!
ここまで読んでいただき、ありがとうございました。
ご質問・ご要望・ご相談などは、下記お問い合わせフォームからお気軽にご連絡ください。
http://www.net-nsi.co.jp/toiawase.html
この記事が面白いと思ったらGoodボタンを押してね~
続きはこちら!