Jitterで動体検知して遊ぶ
この前赤色検知でやってみたけどイマイチだったので普通に動体検知をやってみました。
内容としては映像を入力し、色を取得して●に変換。カメラで動体検知して、動いた場所の●を反応させます。
とりあえずは動きいたけど、かなり頭の悪いやり方になってるはず。
●が20x15になってるのも単にCPU負荷的にこのくらいじゃないとダメだっただけで
ほんとはもっと細かくしてみたい。ちゃんとしたやり方でやれば軽くなるはず。。
今回は下記のような考え方でやってます。
●動体検知
FLASHでやる時と同じ考え方です。
1つ前のコマと比べて色が違ってる部分が動いた部分として認識します。
1)カメラの取得
jit.dx.grab 20 15
Macだとjit.qt.grabです。
20x15のサイズで取得します。
20x15なのは処理軽減のため。。
最初から20x15にするのと、最初は320x240で後から20x15にするのとでどの程度違いがあるかは分からないけど、これでも一応大丈夫でした。
2)カメラ映像の調整
jit.brcosa
映像の明るさ、コントラストを調整し、検知しやすくします。
環境によって変わると思うので数値をいじれるようにしておきます。
3)滑らかに変化させる
jit.slide @slide_up 4 @slide_down 8
暗い場所だとカメラのフレームレートがかなり落ちるので、反応が悪くなります。
元映像をjit.slideで滑らかに変化させることでごまかそうという考えです。
4)反転
jit.dimmap @map 0 1 @invert 1 0
鏡っぽくしたいので映像を反転します。
5)Matrixへ
jit.matrix 7 float32 20 15
最終的なMatrixは色(ARGB)、座標(X,Y)、大きさ(scale)の7つの要素を持たせたいので
plane数が7のMatrixに入れ込みます。
このへんがまず効率悪そう。
6)現在のコマを取っておく
jit.matrix oldmt 4 float32 20 15
次のフレームで1つ前のコマとの違いを調べるために今のコマを取っておきます。
7)1つ前のコマとの違いを調べる
jit.op @op absdiff @val 0.
「absdiff」で違いを調べます。
FLASHでいうブレンドモードのdifferenceみたいなものです。
右のインレットには「jit.matrix oldmt 4 float32 20 15」を入力します。
これは「6」でやった1つ前のコマになります。
このへんは頭使いました。処理の順番が分かりにくい。
これで合ってるのかも分からないけど動いてるからOK。
8)値の調整
jit.op @op * @val 5.
色の違いを使って●のサイズを決めるので、そのへんの調整ができるようにしときます。
9)Matrixへ
jit.matrix 7 float32 20 15
これいらないんじゃないかな。。
10)Matrixの値の変更
jit.expr @expr 0. 0. 0. 0. (cell[0]/6-2.6) -(cell[1]/6-1.2) (in[0].p[1]+in[0].p[2]+in[0].p[3])*0.1+0.05
左から、アルファ、赤、緑、青、X、Y、サイズとなるようにMatrixの中身を変更します。
アルファ、赤、緑、青は別で処理するのでここでは0にしておきます。
「cell[0]」はセルのX値、「cell[1]」がY値になります。表示位置を調整するために少し値をいじります。
「in[0].p[1]」、「in[0].p[2]」、「in[0].p[3]」はそれぞれRGB値。値が大きいほどたくさん動いた部分になります。
11)Matrixへ
jit.matrix 7 float32 20 15
これもいらないんじゃないかな。。
●映像ファイルの入力
1)映像ファイルの読み込み
jit.qt.movie
「read」メッセージを送ることで映像ファイルを読み込みます。
ほんとは外部のDVD映像とかを読み込みたい。
2)滑らかに変化
jit.slide @slide_up 4 @slide_down 8
滑らかに変わったほうがいい感じだったので。
3)plane7のMatrixへ
jit.matrix 7 float32 20 15
動体検知したMatrixと合体させるためにplane数7のMatrixへ。
4)空いてる部分の数値を初期化
jit.op @op * pass pass pass pass 0. 0. 0.
「3」のままだと後ろの3つのplaneは前のplaneの値が繰り返し入ってしまうのでここで0に初期化します。
●Matrixの合成、表示
1)Matrixの合成
jit.op @op +
映像のMatrixと動体検知のMatrixを合体させます。
映像のはアルファ、赤、緑、青、0、0、0になってます。
動体検知のは0、0、0、0、X、Y、サイズになってます。
それぞれを足します。
2)Matrixの中身を1セルずつリストにしする
jit.iter
Matrixの各セルの値の全plane分をリストで出力します。
アルファ、赤、緑、青、X、Y、サイズのリストがセル数分出力されていきます。
3)黒いとこは表示しない
if $f1+$f2+$f3 > 0. then bang
黒いとこは見た目的にあんまり分からないので、処理の軽減のためにも表示させないようにします。
黒じゃない時だけbangを出力します。
4)●の描画
jit.gl.gridshape jit17 @color 0.2 0.9 0.6 0.1 @scale 0.08 0.08 0.08 @shape circle @depth_enable 1 @smooth_shading @automatic 0 @blend_enable 1 @blend_mode 3 1
「2」の出力結果を使ってjit.gl.gridshapeに色、座標、サイズのメッセージを送り、●を描画します。
こんな効率の悪そうな内容になってます。
ほんと誰かに教えてもらいたい。。
| 固定リンク
この記事へのコメントは終了しました。
コメント
こんにちは。以前のエントリでリンク貼られてた者です。
お礼に、自分なりに再現したパッチを送ります。
jit.gl.multipleバージョンも作ってみました。多少、早くなります。
後は、poly~で試したり、jsで記述してみるとか、。
http://adsr.jp/patches/rx8.zip
メールアドレス見つけられなかったのでサーバーにあげました。サイズも4KBしかないですし、半永久的に置いておきますね。以後のエントリとかで直リンクしちゃっても結構です。
投稿: masato221 | 2009年7月 5日 (日) 07時56分
> masato221さん
ありがとうございます!まだ理解できてないけど、とりあえずすごく速くなりました!
jit.gl.multipleはまだ理解できてないんですよね。。なんとなくは分かるんですけども。じっくり見てみます。
いや~勉強になるなあ。
サイトのほうはいつも参考にさせてもらってます。あんまり情報が無いんで助かります~。
あ、うちの同僚が前に一緒に仕事したとか言ってました。
投稿: primevision | 2009年7月 6日 (月) 11時39分