動体検知ソフトを試作(その7) [10年01月01日 19時48分]
#00001256
Windowsパソコンで利用できるMotionのような動体検知ソフトを、自分でも作ってみようと思った。この分野の専門家から見れば稚拙なものだと思うが、とりあえず実験的な段階のものができたので実際に試してみた。

>>ベクターにて公開中

自動車





自転車、バイク





その他


この動体検知ソフトが出力した静止画を、別のソフトを使って動画化(アニメーション化と言ったほうが適切)してみた。

videocam 散歩するヒトと犬
※犬と人が離れているいているため、異なる移動体として認識した。

videocam サイクリング videocam バイク videocam 郵便配達
※車輪が2つある乗り物は、画面の中を3、4秒で通り過ぎる。

videocam 一人 videocam すれ違う人同士 videocam 人と影 videocam 人(近くから)
※人数を同定するのは難しい。

videocam 自動車同士の交差(1) 自動車同士の交差(2) videocam 人と自動車
※1つのシーンの中で、2つ現れた移動体の領域同士が途中で1つになった場合、交差または衝突したと判定できるかもしれない。

videocam 2色の車 videocam 大型車
※単色でない移動体の色はどのように判定すればよいだろうか?。

videocam ボール遊び
※不規則な動きにもある程度追従している。


[1/11]追記

このソフトを、コアロジックはそのままにして、インターフェースを使いやすく作り込んだものを公開した。


[1/1] 追記

次に示す画面のとおり、背景差分法によって残像を移動体と捉えなくなったことを確認した。

  

8近傍のメディアン・フィルタの高速化に関する次の3件の文献を読んだ。文献[1]で提案されている方法を実装して確かめたところ、確かに飛躍的に処理時間が短縮(処理時間:120ms/640x480フレーム)できた。ただし、ここではKoppの方法[3]や縦方向の重なりを利用した更なる高速化はしていない。

[1] Tomoyuki Hamamura et al.,"A Fast Algorithm for 3x3 Median Filtering", http://www.ipsj.or.jp/10jigyo/fit/fit2002/LI_9.pdf
[2] Hiroshi SAKUMA et al.,"Image-Extraction and Speed Estimation of a Moving Object from Photographed Digital Pictures", http://aitech.ac.jp/lib/kiyou/40B/B10.pdf
[3] Manfred Kopp, “Efficient 3x3 Median Filter Computations,”, http://www.cg.tuwien.ac.at/research/publications/1994/Kopp-1994-EMF/TR-186-2-94-18Paper.pdf



[12/31] 改良

  • 「ある一定時間、居座り続けた移動体はそのうちに背景となる」というロジックを組み込んだ。
  • メディアン・フィルタ(8近傍)によるノイズ除去を追加してみたが、処理時間が210ms/640x480フレームあまりかかってしまうので、もう少し処理時間を短くする工夫をした上で改めて実装するとして今回は実装を取りやめた。当然といえば当然の話だが、実際にどのくらい重い処理なのかがこれでわかった。


[12/29] 追記

参照フレームを更新するアルゴリズムを変更して、残像を動体と捉えてしまう欠点を改善した。これに伴って、色の同定も以前よりは改善した。だが、もう少し改良が必要だ。と言うのは、例えば「転がり込んだボールが画面の中で止まった」というような場合、このボールはいつか再び動き出すかもしれないし、ずっと動かないままかもしれない。もし、いつまでも動かないのに参照フレームを更新しないと、いつまでもボールは移動した物体と検知され続けてしまう。従って、「ある一定時間、居座り続けた移動体はそのうちに背景となる」という見極めのロジックを組み込む必要がある。直感的には、直前の映像と比較するというアルゴリズムに着想する。直前の映像と比較して変化した部分が移動したものと考えられるので、この止まったボールの問題は生じないが、そのままロジックを組むと残像の問題に突き当たる。直前の映像ではなく、背景のような映像と比較するアルゴリズムにすると、滞留する移動体の問題に突き当たる。このような意味で、滞留する移動体の問題は、直前の映像と比較するというアルゴリズムをやめて残像の問題から逃れる代わりに、代償として新たに与えられた課題といえるだろう。しばらくは、このアプローチで格闘してみようと思う。


[12/24] 改良

  • 複数の移動体を識別する機能を追加


[12/20] 追記

移動体の色が正しく認識できない。建物の影に入ったときに暗い青になる。自動車のテールライトを捉えて、車体の色ではなく赤っぽい色と認識してしまう。


[12/20] 改良

  • 捕捉した移動体の色を抽出する機能を追加
  • 捕捉した移動体の重心を計算する機能を追加


[12/19] 問題点

  • 風でゆれる立ち木や、のぼり旗に反応してしまう。
  • 肌色フィルタによって移動する人物のみを捕捉する機能については、試しにDilation、Erosion処理(いずれも、5と9)を施した(つもり?)がノイズ低減がうまく行かない。結局、移動を検出した後にHLS色空間のフィルタをかけるロジックにした。、、がまだ不完全。


[12/19] 改良

  • 歩行する人物の場合、頭部は比較的動きが少なく(手足は大きく動く)補足範囲に含まれないことがあるので、指定した割合だけ上部へ捕捉範囲を拡張する機能を追加
  • 動体を検知したときの動作として、メールで通知する機能、外部プログラムを起動する機能を追加


[12/16] 改良

  • 残像も動体とみなしてしまう問題は、状態が安定したときに参照フレームを更新するようアルゴリズムを変更して少し改善したかもしれない。
  • ある程度以上の大規模な移動を検出した場合は、それは本当の移動体ではなく、照明ライトの点灯/消灯、雷の閃光、強い反射、カメラの移動やブレとみなして、検知しないようにした。


[12/15] 追記

Motionのソースプログラムをざっと見てみた。動体検知のアルゴリズムは、alg.cに集約されている。私の方法と似ているところ、似てないところあるが、一番の違いはノイズ低減の方法だ。Motionは、モルフォロジー処理、つまりDilation、Erosionによる孤立点の除去、不連続点の接続、穴埋めによって斑点除去を行っているが、私は独自の方法によってS/N比を改善している。


[12/12] 問題点

  • 残像も動体とみなしてしまう。
  • HLS色空間による肌色検出は失敗。勉強不足!
  • 起動しなかったり、途中で停止する。



ソフトウェアの概要
動作環境Windows XP, Windows Vista, Windows 7、その他は未確認
カメラWindowsで使用可能なWebカメラなど
プログラム言語C++
開発環境Microsoft Visual Studio 2008


(投稿者:管理人)