Motionの内部を覗く

オープンソースの動体検知ソフト、Motionのコアロジックはalg.cに集約されていて非常に読みやすい。次のように、関数名はすべてalg_*と統一されている。

更に、これらのパブリックな関数のほかにalg.cには、次のようなローカル関数も含まれている。

このように、関数名を見ただけでもMotionのコアロジックが、概略どのようなものであるかが想像できるだろう。MMX(MultiMedia eXtensions)アーキテクチャ実装のCPU向けに高速化処理もしている。興味深いのは、私の「頭部補正」と同じような処理をしていることだ。次のプログラムの断片を見ていただくとわかるように、上半分を固定で1.5倍だけ大きく(背伸び)している。

alg.c の関数 alg_locate_center_size より抜粋

  1. if (centc) {
  2.  cent->minx = cent->x - xdist / centc * 2;
  3.  cent->maxx = cent->x + xdist / centc * 2;
  4.  /* Make the box a little bigger in y direction to make sure the
  5.   heads fit in so we multiply by 3 instead of 2 which seems to to work well in practical */
  6.  cent->miny = cent->y - ydist / centc * 3;
  7.  cent->maxy = cent->y + ydist / centc * 2;
  8. }

映像処理のループは、motion.cに含まれる関数motion_loopである。この関数は、2000行ほどの巨大なループを形成している。このループの中は、処理内容ごとに13のセクションに分かれていて、この順序で繰り返し実行されるようになっている。この関数を読めば、Motionの基本的な処理の流れがわかる。先に紹介したコアロジックは、主にCとDで使用される。

映像処理ループの手順
@PREPARE FOR NEW FRAME SECTION時刻取得など、映像フレーム取得の準備。
ARETRY INITIALIZING SECTION カメラが使えない場合、見えるようになるまで10秒ごとにこの処理を続ける。
BIMAGE CAPTURE SECTION新しい映像フレームをキャプチャする。
CMOTION DETECTION SECTION差分抽出によって動体検知する。
DTUNING SECTION雑音レベルのチューニング。
ETEXT AND GRAPHICS OVERLAY SECTION日付や枠を焼きこみ。
FACTIONS AND EVENT CONTROL SECTION画像ファイル保存など、指定されたイベント処理を実行する。トラッキング(カメラの首振り)はここで実行する。
GSETUP MODE CONSOLE OUTPUT SECTION調整のためにコンソールに情報を出力する。
HSNAPSHOT FEATURE SECTIONスナップショット作成。
ITIMELAPSE FEATURE SECTIONFFMPEGによる動画ファイル作成。
JVIDEO LOOPBACK SECTIONビデオ出力およびWebカメラ配信。
KONCE PER SECOND PARAMETER UPDATE SECTION設定変更に対応するよう1秒おきにチェックする。
LFRAMERATE TIMING AND SLEEPING SECTION次のキャプチャまでの時間調整のためスリープ。

Motionは、映像のソースとして/dev/video、つまりV4L2のビデオキャプチャ装置のほかに、ネットワークカメラ(Webカメラ)にも対応しており、しかも同時に複数の映像ソースを処理できるようになっている。このため、映像処理ループはスレッドで動作する。

pthread_create(&cnt->thread_id, thread_attr, &motion_loop, cnt);
2009年12月21日