プロジェクト一覧へ
OpenCVを用いた古典的なリアルタイム動体検知アプリケーション

OpenCVを用いた古典的なリアルタイム動体検知アプリケーション

ビデオソース内の特定の領域(ROI)を監視し、動きを記録する動体検知アプリケーション。移動平均を用いた背景モデルの構築、モルフォロジー変換によるノイズ除去、デバウンス処理を取り入れたステートマシンによるイベント管理を実装。

2024年5月 - 2024年6月 期間: 1ヶ月 最終更新日: 2026年3月12日

使用技術

プロジェクト概要

ビデオソース(Webカメラや動画ファイル)をリアルタイムに監視し、指定された関心領域(ROI)内での動きを検知して自動的に画像を保存するシステムです。 単なるフレーム間差分ではなく、動的な背景更新モデリングやノイズ除去、ステートマシンを用いたイベント管理を実装することで、環境変化に強く実用性の高い検知を実現しました。

技術的な理論背景については、こちらの解説ブログで詳しく公開しています。

検出結果

  • 使用言語: Python
  • 使用ライブラリ: OpenCV(opencv-python),NumPy
  • 主な機能: 動体検知、ROI指定、動的背景更新、検知画像の自動保存機能

技術的な工夫とアーキテクチャ

単なる動体検知に留まらず、実運用を想定した精度向上のための工夫を取り入れています。

1. 環境変化に適応する「動的な背景モデル」

単純なフレーム差分では日差しの変化やカメラの微細な揺れで誤検知が発生します。これを防ぐため、cv2.accumulateWeighted を用いた移動加重平均による背景モデルを導入しました。これにより、天候や時間帯による緩やかな明るさの変化を自動で学習・適応し、真に動いた物体のみを抽出します。

2. ノイズ除去とステートマシンによるイベント管理

二値化後のマスク画像には、数種類のモルフォロジー演算(オープニング/クロージング)を適用し、微細なノイズの除去と輪郭の結合を行っています。また、瞬発的なノイズによる誤保存を防ぐため、以下の状態遷移ロジックを実装しました。

  • 開始判定: 指定フレーム数連続で動きを検知した場合のみ「検知イベント」を開始。
  • 終了判定: 動きが一定期間途絶えたことを確認してイベントをクローズ。

今後の改善点と展望

  • 物体認識AIとの統合: 現在はピクセルの変化をトリガーとしていますが、例えば風邪で揺れる木々なども検知してしまいます。YOLOやSSDといった軽量な推論モデルをパイプラインに組み込み、「人」や「車」などの特定のオブジェクトが動いた時のみイベントを開始させるシステムへの拡張を構想しています。
  • マルチカメラ・マルチスレッド化: 現在は単一のビデオソースを処理していますが、複数台のカメラを同時監視できるようスレッド・プロセス処理を導入し、Rasberry Pi等で動作するIoTハブとしての機能を持たせたいと考えています。

関連プロジェクト