本記事で紹介するプログラムは以下の GitHub リポジトリで公開しています
記事一覧
本連載は全3回構成です。各ステップでシステムの構築から実機運用までを解説しています。
この記事のねらい
前回の記事では、Cloudflare Workers を利用した通知基盤の構築を紹介しました。
今回は、Windows PC に接続した Web カメラを用いて、ランプの状態検知から Discord への通知までの一連の流れをテストします。
Raspberry Pi による常時監視を行う前に、まずは Windows 環境でエンドツーエンドの動作確認をすることが目的です。
この記事でやること
- カメラの認識確認: PC が Web カメラを正しく認識できているかを確認します。
- 検知領域(ROI)の作成: 映像のどこを監視するか、マウス操作で簡単に設定します。
- 位置合わせの補助(任意): 仮想ダッシュボードを使い、ROI 設定の当たりをつけます。
- 検知&通知テスト: 実際のカメラ映像でランプの状態変化を検知し、Discord に通知を送ります。
Step 0: 準備 – 設定ファイル config.yaml の確認
作業を始める前に、設定ファイル config.yaml の内容が正しいか確認しておきましょう。
camera.device_id: 使用するカメラの番号です(通常は0)。camera.size/camera.fps: カメラの解像度とフレームレートです(例:[1280, 720],20)。notify.worker_url/notify.secret: 第 2 回で設定した Cloudflare Workers の URL とシークレットキーです。logic.*: 検知ロジックのパラメータ(色のしきい値など)です。rois.*: 検知領域の座標です。この後のステップでツールを使って生成します。
Step 1: PC が Web カメラを認識できるかチェックする (camera_debug.py)
まずは、プログラムが Web カメラをきちんと利用できるか、OS と OpenCV の両面から診断します。
実行コマンド
python camera_debug.py
このスクリプトの役割
- Windows のプライバシー設定が適切かを、確認項目としてリスト表示します。
設定 > プライバシーとセキュリティ > カメラ- 使用している Python(例: Python 3.13 など)の実行ファイルにカメラのアクセス許可が付与されているかを確認してください。

- 複数の方法(バックエンド)でカメラへの接続を試み、最も安定して接続できる方法を探します。
- カメラを正常に認識できた場合、
VideoCapture(...): Trueのような成功メッセージと共に、1 秒間だけプレビュー映像が表示されます。
うまくいかないときは?
- 他のアプリ(Teams, Zoom, ブラウザなど)がカメラを使用していませんか?
- デバイスマネージャーで、カメラのドライバーは正常にインストールされていますか?
- PC に複数のカメラを接続している場合、
config.yamlのdevice_idを1,2... と変更して試してみてください。
Step 2: 実映像を見ながら ROI(検知領域)を設定する (roi_tool.py)
このツールを使って、ランプ部分だけを正確に囲みましょう。
実行コマンド
python roi_tool.py
ツールの操作方法
- マウス左ドラッグ: 監視したいランプを四角で囲みます。
n/pキー: 次/前のランプへ切り替えます(ID: 1〜12)。dキー: 現在選択しているランプの ROI を削除します。sキー: 設定を保存します。config.yamlファイルに自動で反映されます。q/ESCキー: ツールを終了します。
設定のコツ
- 余白は最小限に: 周囲の光や部材が映り込むと、誤検知の原因になります。ランプが光る範囲だけをピッタリと囲みましょう。
- 面積は十分に確保: 小さすぎると、映像のブレや明るさの変化で検知が不安定になります。
Step 3 (任意): 仮想ダッシュボードで位置合わせをシミュレーション (sim_dashboard.py)
手元に実機の制御盤がない場合でも、この仮想ダッシュボードを使えば、ROI 設定の当たりをつけることができます。
実行コマンド
python sim_dashboard.py
操作例
1~=キー: ランプ 1〜12 の色を個別に切り替え(緑 ↔ 赤)。g/rキー: すべてのランプを緑 / 赤に一括変更。bキー: 点滅モードの ON/OFF。
※ この画面を Web カメラで映しながら roi_tool.py を使うことで、おおよその位置合わせが可能です。
Step 4: 実映像での検知&通知をテストする (monitor_webcam.py)
これまでの設定を元に、実際のカメラ映像を使って検知から通知までの一連の流れを確認します。
実行コマンド
python monitor_webcam.py
注目するポイント
- プレビュー画面:
- 左上には現在のフレームレート(FPS)が表示されます。
- 設定した ROI が四角い枠で表示され、検知状態に応じて色が変わります(GREEN/RED/UNKNOWN)。
- コンソールログ:
- ランプの状態が変化すると、
ランプ 3: GREEN → REDのようにログが出力されます。 - 通知が送信されると、
バッチ通知送信成功のようなメッセージが表示されます。
- ランプの状態が変化すると、
バッチ通知
短時間(デフォルト 2 秒)に複数のランプが点灯しても、通知が大量にこないように、メッセージを 1 つに集約して送信する仕組み(バッチ通知)が備わっています。
また、notify.min_interval_sec で再通知の間隔を調整し、通知スパムを防ぐことも可能です。
検知精度を上げる調整のヒント
実際の設置環境では、照明の明るさや外光の影響で、うまく検知できないことがあります。そんな時は、以下のパラメータを調整してみてください。
- HSV のしきい値 (
logic.red_*,logic.green_*): 環境光によって「赤色」「緑色」の最適な HSV 値は変化します。現場の映像を見ながら、赤と緑が最も安定して認識されるしきい値に微調整しましょう。 - 判定の安定化 (
frames_window,majority): 映像のチラつきによる誤検知を防ぐため、「何フレーム分の映像を見て状態を判断するか」を調整します。値を大きくすると安定しますが、検知の反応は遅くなります。 - カメラ設定の固定: Web カメラの多くは、明るさに応じて自動で露出やホワイトバランスを調整します。この機能が色の判別を不安定にさせることがあるため、可能であればカメラの専用ツールなどで露出やゲインを固定すると、検知精度が向上します。
トラブルシュート早見表
| 症状 | 確認/対処 |
|---|---|
| カメラが開けない | 他アプリが使用中/ドライバ/プライバシー設定/device_id |
| 動画が重い/FPS が出ない | 解像度・FPS を下げる/DSHOW 優先/CAP_PROP_BUFFERSIZE=1 |
| 誤検知が多い | ROI 見直し/HSV しきい値/frames_windowや合意率/min_brightness_v |
| 通知が来ない | Workers URL/SECRET 一致/署名ヘッダ/Discord Webhook 動作 |
| 連投が多い | notify.min_interval_sec を上げる/バッチウィンドウ調整 |
まとめと次回予告
- Windows 上で カメラ認識 → ROI 設定 → 実映像検知 → Workers 経由 Discord 通知 を一通り確認しました。
- 次回は Raspberry Pi 5 へ移植して実機運用 を行い、パフォーマンス/信頼性を評価します。
➡️ 第 3 回:Raspberry Pi 5 に移植して現場で動作検証する
付録:実行コマンドまとめ
# 1) カメラ診断
python camera_debug.py
# 2) ROI設定(保存でconfig.yamlに反映)
python roi_tool.py
# 3) (任意)ダッシュボードで位置合わせ補助
python sim_dashboard.py
# 4) 実映像で検知&Discord通知
python monitor_webcam.py
