Jitterで赤色検知
jit.exprを使ってカメラの映像の赤色検知をしてみました。
jit.exprはサンプルとかでよく使われてるけど意味が分かりにくい。
実験してみてやっとちょっとだけ分かった気がします。
<カメラの映像取得>
「jit.dx.grab 160 120」というオブジェクトを作って「open」メッセージを
送ってあげるとカメラの映像を取得できます。
ちなみにWindowsとMacでやり方が違ってて、これはWindowsの場合。
MacだとQuicktimeの機能を使うので「jit.qt.grab」となります。
「160 120」の部分はサイズ。
<映像の色データをMatrixへ>
「jit.matrix 4 float32 160 120」としてMatrixを作成。
「160 120」はMatrixのサイズ。これはカメラの取得サイズに合わせます。
「4」という数字はこの場合「160x120のサイズのMatrixを4枚」という感じの意味です。
「plane」というパラメータになります。
なぜ4つかというと、映像の色データ=ARGBの各値を各planeに割り振るわけです。
<赤色検知>
「jit.expr @expr 1 (in[0].p[1]-(in[0].p[2]+in[0].p[3])/2-0.1)*10 0 0」とします。
@exprのとこはスペースで区切って各planeに対する計算値を書きます。
1つめはアルファ値。だと思うんだけど値変えても特に変化ないので違うのかな。。
3つめ、4つめは緑、青の値。そこはいらないので0にします。
2つめがややこしくなってます。
考え方としては赤い部分を検出するにはR値が大きい部分が分かればよさそうですが
白いところか明るい部分は赤くなくてもR値は大きくなります。
なので「赤い部分だけ」を取得するにはR値が大きく、GとBの値が小さい部分を取得すればいいのかなと。
というわけで、計算は適当だけど「R値-(G値+B値)/2」ってしてみました。
これをexprでやる場合にどうしたらいいのか。
ドキュメントを見てみると「in」というのがあって、それが渡ってくるMatrixの値っぽい。
「in[0]」って[]内に数字を書きます。これはなんだろうな。。おそらくMatrixが複数渡ってくる場合があって、どのMatrixかを指定するためなのかと。分かんないけどここは通常0でいいかと。
例えば「jit.expr @expr in[0] in[0] in[0] in[0]」とすると各値に渡ってきたMatrixがそのまま設定されます。
「jit.expr @expr in[0]*0.5 in[0]*0.5 in[0]*0.5 in[0]*0.5」とすると全部半分の値になるので暗くなります。
ちなみに全部同じ計算をするのであれば「jit.expr @expr in[0]*0.5」と1つだけ書けばいいです。
まずは「jit.expr @expr 1 in[0] 0 0」としてみます。
R=赤は渡ってきたMatrixの中身そのままになります。GとBは0になります。
これで赤のチャンネルのみ表示できました。
先ほどの計算「R値-(G値+B値)/2」をしてみます。
「in[0]」で渡ってきたMatrixを取得できるけども、これは2つめに「in[0]」と書いたら渡ってきたMatrixの2つめのplaneの値を受け取ることになります。
なので「in[0]」だけだと赤(2つめ)のとこで緑(3つめ)と青(4つめ)の値が取れません。
他のとこの値をとるには「in[0].p[1]」とします。
「p」ってのが「plane」の略っぽいですね。
「in[0]」が渡ってきたMatrix(の1つめ)、その中にあるplaneを「p[1]」で[]内でplaneの番号を
指定して値を取得できるということです。
「p[1]」を省略したら勝手に対応するplaneの値を取得できるってことですね。
なので「jit.expr @expr in[0] in[0] in[0] in[0]」と書くと、それは勝手に
「jit.expr @expr in[0].p[0] in[0].p[1] in[0].p[2] in[0].p[3]」としたのと
同じになるってことみたいです。
というわけで「R値-(G値+B値)/2」を計算するには
「in[0].p[1]-(in[0].p[2]+in[0].p[3])/2」
とすればOKです。
表示確認用にちょっと計算を変えてます。
0.1を引いて暗い赤は完全に暗くして、残った赤は10倍にしてより明るい赤にしてます。
あとはこの結果のMatrixで、2つめのplaneの値を見れば赤色部分が分かるのでそれを
使えばいいのかなと思います。
| 固定リンク
この記事へのコメントは終了しました。
コメント