【レポート】PythonでWebカメラの映像を取得してみた(OpenCV編)

Python

皆さん、こんにちは!
上越市を拠点にし、「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つの戻り値が返ってきます。
これを元に撮影が成功したかを判断し、失敗した場合はループから抜け、成功した場合は次の処理へ続きます。

変数詳細
ret1フレームの撮影が成功したかどうか
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ボタンを押してね~

タイトルとURLをコピーしました