
WEBCAMで動体検知やってみた
mattodesign blog » ActionScript » WEBCAMで動体検知やってみた
前にもやったことのある動体検知ですが、認識率悪かったり最適化できてなかったりと改善点あったので、もっかいやってみた。
動体検知して何しようと思い、最初は動いた部分だけパーティクルで崩れるようにしてたのですが、いまいち良い表現にならず、流行りのみかんを出してみることにしました。
虫みたいできもい。
以下は備忘録的なメモです。
・カメラ映像はデフォルトだと左右反転してしまう
これだとちょっと気持ち悪いので、Matrixを使って鏡みたいに反転させた。
まずscaleを-1倍して左右を反転。そして、対象のビットマップの幅分をx方向に移動させてやればOK。
// カメラ映像を左右反転してdrawする
_mat = new Matrix( -1, 0, 0, 1, _videoBmd.width);
_videoBmd.draw(_video, _mat);
・動体検知
要は、1フレーム前の映像と現在の映像の差異をBlendMode.DIFFERENCEで調べて、動きがあった部分のピクセルを0xFFFFFFFFで表示。
0xFFFFFFFFで表示されたピクセル情報を_particleListに格納してパーティクルを発生させている。
動体検知の映像は表示されずに、裏で処理してるので、見たい場合は_oldBmdをaddChildしてやれば見れます。
動体検知部分のソースがこちら。
色々な方のソースを参考にしているので、他にもいぱい方法はあるはず!
// 動体検知
_oldBmd.copyPixels(_videoBmd, _videoBmd.rect, _pt);
_oldBmd.draw(_beforeBmd, null, null, BlendMode.DIFFERENCE);
_oldBmd.threshold(_oldBmd, _oldBmd.rect, _pt, ">", 0xFF222222, 0xFFFFFFFF);
_beforeBmd.copyPixels(_videoBmd, _videoBmd.rect, _pt);
// 動体検知情報を_particleListに格納
var margin:int = 20;
for (var x:int = 0; x < _oldBmd.width; x = x + margin) {
for (var y:int = 0; y < _oldBmd.height; y = y + margin) {
if (_oldBmd.getPixel(x, y) == 0xFFFFFF) {
_p = new Particle();
_p.x = x;
_p.y = y;
_particleList.push(_p);
}
}
}
と、2009年も残すところあと3日!!
よいお年を!!
来年はもっとブログ更新するようにしよ。
« 前の記事へ
次の記事へ »
