2009年9月17日 (木)

Androidアプリ 天気予報

天気予報
http://jp.androlib.com/android.application.cc-primevision-weather01-qnCi.aspx

Weather_widget Weather_setting











天気予報のアプリを作ってみました。
そんなのすでにたくさんありそうじゃん!と思うかもしれないけど、意外とないんです。
いくつかアプリはあるんだけど一つだけ足りない部分があって、それは降水確率。
晴れとか曇りとかだけじゃなくて降水確率も知りたいので、そういうのがないなら自分で作ろうかと。
単にどっかのRSS引っ張ってくればいいだけなので。

どこの天気予報でも降水確率は必ず出ているんだけど、それをデータとして提供しているところは少ないです。
Yahooもないし、WeatherHackっていうAPI公開してるlivedoorでも降水確率に対応してない。
で、見つけたのがMSNの天気予報。ここのRSSには降水確率がありました。なのでMSNを採用。
コメントをいくつかいただいてますが、やっぱり降水確率があるというのが大きいみたいです。
Androidアプリはね、まだいいものが少ないですよ。

今回のアプリはデスクトップ上(HOME画面上)に天気予報を表示できるようにしました。
普通のアプリはアイコンクリックで立ち上がるけど、Androidでは「ウィジェット」として
PCのウィジェットのようにデスクトップ上でアプリを表示することができます。
このへんはAndroidのいいとこでもあります。

<今後>
・更新間隔を設定できるようにする
・今は「今日」と「明日」の天気を表示してるけど、夜9時以降は「明日」と「明後日」が表示されるようにする
・今いる場所の天気を表示できる機能をつける
・デザイン(誰かやって・・・)
というようなことを考えてます。

| | コメント (0) | トラックバック (0)

Androidアプリ 週末は箱根へ行こう。

ケータイをAndroidにしたのでAndroidアプリを作ってみました。
なんでAndroidにしたかというと、単にMac環境がないのでiPhoneアプリは作れない、Androidアプリなら作れる、というだけです。 最近イベントとか行くとみんなiPhoneでおもしろいことしてたりするので、そういうの見ると今からでもiPhoneにしようかと悩んでしまうけども。。

まずは練習ついでに作ったのがこれ。
http://jp.androlib.com/android.application.com-gotohakone-app02-qint.aspx

Hakone_map_3 Hakone_detail












「週末は箱根へ行こう。」というサイトをやってるので、そこで持ってるデータを表示するだけのものです。
FLASHで作った↓これのAndroid版です。
http://www.gotohakone.com/hotels/map.html


このサイトのほうは「じゃらん」のデータを使ってます。
空室検索のAPIの検索は重く、APIの呼び出しも1秒に1回までというキビシイ制限があるのでデータはうちサーバのDBのにためて、ユーザーが見るときはそこからデータを引っ張ってくるようにしてます。
(こういうのいけないんだと思ってたけど、問い合わせたらOKと言われた)
そのデータは常に更新していかなきゃいけないので、cronでPHPを実行して自動で更新される仕組みにしてます。
ただ、サーバはhetemlを使ってるけどcronが5個までしか設定できません。1時間に最大5回までの実行しかできません。
1回の実行で1秒間隔で旅館ごとの空室検索をしてますが、タイムアウトの関係からか1回につき数件分の取得しかできません。
箱根の旅館が今170件くらいあるので、全部のデータが最新になるのに数時間かかります。
まあ、箱根だけだったらこれで問題ないんだけど、今後は全国の旅館でやりたいし、それを考えるとしんどいね。。

ちなみに今のところサイトのアクセス数は少ないです(見て分かるとおり)。
アフィリエイトでたまに注文はいるけどそれはほぼブログパーツからの遷移です。
こういうサイトはたくさんあるし、何かしら差別化をしないといけないと思ってるんだけどずっと考え中な感じ。

| | コメント (0) | トラックバック (0)

2009年9月16日 (水)

Bridge行ってきた。

疲れてたので21時からのTSUTSUIさんのだけ。
それはもうカッコイイですよ。
Jitterがんばろう。
adsrでダウンロードできるやつで「bezier」のところがずっと
動かなかったんだけど、ようやく「jasch objects」ってのを
見つけて動かせた。一緒に入ってるのはMac版だった。

この前のお礼もあるのでちょっと話しかけようと思ったけど
見失ってしまった。。

Bridge

Bridge

| | コメント (0) | トラックバック (0)

2009年7月15日 (水)

MAX/MSP+Jitter 指定したフォルダの映像ファイルをランダム再生

ローカルのフォルダに映像ファイルを入れておけば、それをランダムで再生できる仕組みを作ってみました。
相変わらず非効率な処理っぽいけどこれは動けば問題ないかと思う。。


rondom_movie


1.黄色のボタンクリック
映像ファイルがあるフォルダを指定します。

●フォルダの指定
フォルダを指定するには「opendialog fold」オブジェクトにbangを送ってあげればダイアログが開きます。
「fold」がついてないとファイル選択になります。
選択後、フォルダのパスを送ります。
送り先は「folder」オブジェクトと真ん中あたりのpack、右上の確認用のメッセージです。

●映像ファイルリストの取得
「folder」オブジェクトを使います。
さっきの「フォルダの指定」で、このfolderオブジェクトにフォルダのパスが送られてきてます。
これにbangを送るとそのフォルダのファイルリストが取得できます。
映像ファイルのみ取得したいので、最初に「types MooV」というメッセージを送っておきます。
(「MooV」はmovファイルだけかな??)
取得したリストはumenuに送ります。

1.赤のボタンクリック
ムービーのランダム再生を始めます。
その前の設定も同時にやってます。処理順的にこれでいいのか分からないけど一応動いてます。

●ファイル数の取得
umenuに「count」メッセージを送るとリスト数が取得できます。
出力は「count 4」みたいになるのでzl slice 1で分けて数値だけ取得します。
この数値をrandomの範囲に設定します。

●ランダム
umenuに設定されているファイル名の中からランダムで1つ選ぶために「random」を使います。
「random」の右のインレットはrange(範囲)で、0からこの範囲内でランダムな数値を出力します。
出力された数値はumenuへ送られます。
umenuは数値が送られてくると、それに対応する番号の項目を出力します。

●パス+ファイル名
umenuの2つめのアウトレットからファイル名が出力されてきます。
これと、最初に選択したフォルダのパスをつなげます。
ここはいいやり方が分からなかったけど、以下のような考え方でなんとかやりました。

・「tosymbol」はリストの中身を連結させて文字列にする。何も指定しなければ単にスペースが消される感じ。
・そのために「パス ファイル名」というリストを作る。
・packを使ってリストを作る。
・「パス ファイル名」とするにはpackの1つめのインレットにパス、2つめにファイル名を入れたい。
・でもパスは基本的に入ってくるのは最初だけで、ファイル名がどんどん変わってく。
・packは1つめのインレットが変更された場合に出力される。
・pakにすれば2つめのインレットに値が入ってきたときも出力されるが、パスが送られてきた時は出力したくない。
・なのでやっぱりpackで、最初は「ファイル名 パス」というリストにする。
・その後に「zl rev」で反転し、「パス ファイル名」というリストにする。

「prepend read」で「read パス+ファイル名」というメッセージを作って送ります。

●映像切り替え
「jit.qt.movie」はさっきのreadメッセージを受け取ることで、映像を再生します。
普通にやると永遠とループ再生されてしまうので、再生が1回終わったら次の映像を再生するようにします。

「jit.qt.movie」のアトリビュートでループ関連のものがあるので設定します。
@loopはループするかどうか、ループする場合の方法を設定できます。
@loopreportはループ通知フラグ。再生がループ ポイントを通過するときに「loopnotify」メッセージが送信されます
@loopreportは「1」にしておけばよさそうです。
@loopは1回再生でいいから0でいいのかなと思うんだけど、0にすると1回目しか「loopnotify」メッセージが送信されませんでした。
ここはデフォルトの「1」でいいみたいです。(なので書く必要はない)

「loopnotify」メッセージは右のアウトレットから出力されます。
「select loopnotify」で、送られてきたメッセージが「loopnotify」の場合にbangを出力させます。
そのbangは左上のrandomのとこに渡り、再度ランダムでファイルを指定することで再生されます。
「●ランダム」のところからここまでを繰り返します。

これをサブパッチ化して使いまわせるようにしよう。

| | コメント (0) | トラックバック (0)

2009年7月14日 (火)

「Jitterで動体検知して遊ぶ」を高速化してもらいました!その2

前回に引き続きhttp://adsr.jp/のmasato221さんが作ってくれたものを解読していきます。
今回はjit.gl.multipleを使ったバージョンで、さらに処理が速く、効率化されてます。

jitter_rx8_multi

●描画オブジェクトの生成
「jit.gl.multiple」はjit.glオブジェクトを繰り返し描画することができます。
やりたいのは●を敷き詰めることなので、jit.gl.gridshapeで●を作っておきます。

jit.gl.gridshape sample @shape circle @depth_enable 1 @automatic 0 @blend_enable 1 @blend_mode 6 1 @dim 10 10 @name pixel @texture tex1 @tex_map 3 @tex_plane_s 0.5 0. 0. 0.5 @tex_plane_t 0. 0.5 0. 0.5

@name pixel
「pixel」という名前をつけています。
「jit.gl.multiple」で繰り返すオブジェクトを指定するための名前です。

読み込んだ映像をテクスチャとして使うための設定もしています。
@texture tex1
「tex1」という名前がついたテクスチャを使うようにします。

@tex_map 3
@tex_plane_s 0.5 0. 0. 0.5
@tex_plane_t 0. 0.5 0. 0.5
この3つはテクスチャの適用方法になると思うんだけど、まだ理解はできず。
tex_plane_sとかはデフォルト値でいいような気がしてしまうけど、なんでこういう値になるのか。。
まあそのうち理解できるはず。

●映像の読み込み
1)jit.qt.movie 20 15 @unique 1
普通に読み込みます。

2)jit.slide @slide_up 4 @slide_down 8
Matrixが滑らかに変化するようにします。

3)jit.gl.texture sample @name tex1
テクスチャを作成します。「tex1」という名前にします。

●動体検知
「jit.matrix 3 float32 20 15」まで前回のと同様です。

●描画
1)jit.expr @expr \"snorm[0]*in[1]*1.33\" \"snorm[1]*-1.*in[1]\" \"0\"
X,Y,Z値を計算します。Zは0で、X,Yは前回と同じ計算です。

2)jit.expr @expr \"(in[0]+(in[1]/50))\"
scale値を計算します。
in[0]は動体検知の結果。動きが大きい部分=白に近い=値が大きいほど描画する●が大きくなります。
in[1]は右のインレットからの入力値。

3)jit.matrix 1 char 20 15付近
これは「jit.gl.multiple」のテクスチャの初期設定みたいなもの?
ディメンション値が変わったとき(最初も含む)に実行されて、全てのセルを1にして出力します。

4)jit.gl.multiple sample 3 @targetname pixel @glparams position scale texture

「3」はプレーン数かな?

@targetname pixel
繰り返し描画するオブジェクトの名前を指定します。

@glparams position scale texture
インレットで受け取るパラメータ。
この指定で第1インレットがposition、第2がscale、第3インレットがtextureになります。
描画する●たちのpositionとscaleの値をMatrixで受け取ることで描画します。
textureのほうは・・・なんだろう?テクスチャとなるMatrixと同じディメンション数のMatrixを渡してあげればいいっぽいけども。このMatrixの中身分だけ描画が繰り返される気がする。


こんな感じでまだ完全に理解できてるわけではないです。
それでもmasato221さんに作ってもらったのを見る前と今とでは全然違う。
「jit.gl.multiple」もよく分かんないからいいやって思ってたけど、今なら全然使える気がする。。
ほんとmasato221さんありがとうございました~。

今回のやつは会社のエントランスに設置してみる予定です。
他にもいろいろ作る予定。WEBカメラだけじゃなくてセンサーも使ってみたい。やっとGainerを使う日が来るかも。
会社のサイトとの連動も考えてます。

とりあえずローカルにある映像を順番に再生するのをやりたいのだが・・・

| | コメント (0) | トラックバック (0)

2009年7月 9日 (木)

「Jitterで動体検知して遊ぶ」を高速化してもらいました!その1

前回の「Jitterで動体検知して遊ぶ」で、いつも参考にさせてもらっているhttp://adsr.jp/のmasato221さんからコメントをいただき、なんと高速処理版を作ってくれました!
しかも2種類。いやーほんとありがたいです。うれしいです。助かります。
データは直リンクOKということでしたので遠慮なくリンクしてみます。
http://adsr.jp/patches/rx8.zip

masato221さんとはうちの同僚&元同僚がaircordのサイト制作で関わったとか。
なんか機会があればよろしくお願いします。。

というわけで今回は作っていただいたパッチの1つめを見てみます。

jitter_rx8

●映像入力
右上のエリアで動画を読み込みます。
読み込んだ動画は「color」という名前をつけたMatrixに入れておきます。
これを後で使います。

●動体検知
真ん中のエリアです。

1)jit.dx.grab 20 15 @unique 1
「@unique 1」というのが追加されました。
ドキュメントを見ると「デジタイザから新しいフレームを受信しなかった場合は bang には応答しません。」と書いてあります。
WEBカメラのフレームレートって低いので、前回のbangのタイミングとフレームが変わってなかったら何もしないってことですかね。処理が軽減されますね。

2)jit.rgb2luma
1プレーンのグレースケールのMatrixに変換します。
動いた部分を調べるだけならグレースケールの1プレーンだけでOKですね。
さらに処理が軽減されますね。

3)jit.dimmap @map 0 1 @invert 1 0
Matrixを(映像を)反転します。鏡っぽくするので。

4)t l l → jit.op @op absdiff
ここがよく分からず。。
2つのMatrixの違う部分を調べてるのは分かるけども、1つ前の「t l l」で違うMatrixを出力できてるということだろうか?
今のフレームと1つ前のフレームを比べることで動いてる部分を調べることができるはずだけどこれだと同じフレームが渡されてる感じがしてしまう。
うーん、もしかすると、両方のインレットにMatrixが送られてくるのはほぼ同時だけど厳密には同時ではないから1つめのインレットにMatrixがきた時点では2つめのインレットに入ってるMatrixは1つ前のだから大丈夫ってことかな。
そういうことにしておこう。

5)jit.expr @inputs 3 @expr \"snorm[0]*in[1]*1.33\" \"snorm[1]*-1*in[1]\" \"(in[2]/100)+in[0]\"
exprはあんまり理解してなかったけど、今回理解が深まりました。
・in[0]の数値はインレットの番号っぽい。
 なのでin[1]は2つめのインレットに入ってくる値。
・cell[0]はMatrixのX座標。1,2,3,4,5,・・・
・cell[1]はMatrixのY座標。1,2,3,4,5,・・・
・norm[0]はMatrixのX座標を0~1の範囲で正規化したもの。ex)0.0,0.1,・・・,0.9,1.0
・norm[1]はMatrixのY座標を0~1の範囲で正規化したもの。ex)0.0,0.1,・・・,0.9,1.0
・snorm[0]はMatrixのX座標を-1~1の範囲で正規化したもの。ex)-1.0,-0.9,-0.8,・・・,-0.1,0.0,0.1,・・・,0.9,1.0
・snorm[0]はMatrixのY座標を-1~1の範囲で正規化したもの。ex)-1.0,-0.9,-0.8,・・・,-0.1,0.0,0.1,・・・,0.9,1.0

norm、snormの意味が今まで分からなかったけどやっと分かった。これは便利だ。

「@inputs 3」としてインレット数を3つに変更。
2つめので●の並ぶ間隔、3つめので●の大きさを調整できるようになってます。

ここでできたMatrixはプレーン数が3つで、X値、Y値、サイズとなってます。

6)jit.iter
Matrixを1セルずつ出力していきます。
1つめのアウトレットではさっきのMatrixのX値、Y値、サイズがリストで出力されます。

「zl slice 2」でそのリストの最初の2つを1つめのアウトレットに出力。
「prepend position」で「position」とくっつけて「position X Y」というメッセージにする。
「zl slice 2」の2つめのアウトレットは残り(この場合はサイズ)が出力されます。
それを「prepend scale」で「scale」とくっつけてメッセージにします。

jit.iterの2つめのアウトレットでは今出力しているセルの座標がリストで出力されます。
その座標を使って「getcell X Y」のメッセージを作ります。
これを最初に作った「color」という名前の映像のMatrixに送ることで、その座標の色を取得できます。
getcellメッセージの出力結果は「jit.matrix color」の2つめのインレットから出力されます。
メッセージ内容は「cell X Y val A R G B」となってます。
必要なのは後半の「R G B」の部分だけなので「zl slice 5」として「cell X Y val A」と「R G B」に分けます。
「R G B」が2つめのインレットから出力されます。
それを「prepend color」としてcolorのメッセージにします。
また、同時に「if $f1+$f2+$f3 > 0. then 1 else 0」で色を調べて、黒だったら●を表示しないようにします。
これは「gate」に黒だったら0、黒じゃなければ1を送ることでbangメッセージが最後の「jit.gl.gridshape」に行かないように制御しています。

7)jit.gl.gridshape sample @shape circle @depth_enable 1 @automatic 0 @blend_enable 1 @blend_mode 3 1 @dim 10 10
●を表示します。


処理もすっきりしたし、処理速度も速くなりました。
前は20x15でもけっこうCPU負荷が高かったけど、これだと48x36でも大丈夫です。
左上のとこで変更できます。

いろいろと勉強になりました。
なんかレベルアップした気がする。。

では次はもう1つのjit.gl.multipleを使ったバージョンを見てみます。こっちはさらに速くなっております。
でもmultipleはまだ理解できてなくて・・・これを機に理解できるようにしよう。
また一通り解読したらブログに書きますので。

| | コメント (2) | トラックバック (0)

2009年6月22日 (月)

Jitterで動体検知して遊ぶ

この前赤色検知でやってみたけどイマイチだったので普通に動体検知をやってみました。
内容としては映像を入力し、色を取得して●に変換。カメラで動体検知して、動いた場所の●を反応させます。

とりあえずは動きいたけど、かなり頭の悪いやり方になってるはず。
●が20x15になってるのも単にCPU負荷的にこのくらいじゃないとダメだっただけで
ほんとはもっと細かくしてみたい。ちゃんとしたやり方でやれば軽くなるはず。。

jitter17

今回は下記のような考え方でやってます。


●動体検知
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に色、座標、サイズのメッセージを送り、●を描画します。


こんな効率の悪そうな内容になってます。
ほんと誰かに教えてもらいたい。。

| | コメント (2) | トラックバック (0)

2009年6月 9日 (火)

ねんぴょー

なんか流行っているみたいで。。

http://nenpyo.org/primevision

けっこう夢中で書いちゃうなあ。
昔を思い出すのもボケ防止にいいみたいなので昔のもちょこちょこ追加しよう。

| | コメント (0) | トラックバック (0)

Jitterの赤色検知で遊ぶ。

前回のJitterでの赤色検知を使って、ちょっとした動きを追加。

画面内の赤い部分にパーティクルを発生させたいだけなんだけど、これが難しい。。
Flashだったら簡単にできるのになあ。単に俺が理解してないだけなのでこのソフトが悪いわけではないんだけども。

jit13

jit13_patch

1.処理軽減
MAX/MSPだったらパーティクルたくさんあっても軽い、みたいな先入観があったけど
そのへんはちゃんと作らないとやっぱり重くなるね。
カメラの取得サイズが160x120の場合19200となるわけで、それ全部パーティクルにしたらそれなりに重いか。

前回の赤色検知では160x120でやってたけど、そこはそのまま使いつつ、その後にサイズを小さくします。

jit.matrix 1 float32 20 15 @planemap 1

新しくMatrixを作ります。
赤色検知では最初にカメラの取得があるのでARGBの4つのplaneが存在してたけど、
最終的に使うのは赤の部分だけなので、新しいMatrixはplaneを1個だけにします。
「@planemap 1」で渡されたMatrixのplaneの1のやつ(0から始まるので2番目)がコピーされます。
とりあえずこれでデータ的には4分の1になるのかなと。
サイズは「20 15」としました。8分の1に圧縮されます。セル数的には64分の1。
セル数は300になり、この300個分のパーティクルを作るようにします。

2.パーティクル
「jit.gl.mesh」を使います。
2つあるのは四角を表示する用と、それらをつなぐラインを表示する用になってます。
@draw_mode が違うだけで他は同じです。

3.条件分岐
先ほど小さくしたmatrixの各セルごとに値を調べます。
その値が0.001より大きいときはその座標に向かってパーティクルは動き、
そうでない場合は真ん中に戻るようにしたいので、条件分岐をしたいなと。
最初は「if文なんてねーだろ」って思っていろいろ調べちゃったけど、普通にありました。

if $f1 > 0.001 then $i2 $i3 $f1 bang else 10 7.5 0. bang

$f1=1つめのインレットに渡される値=赤色の値
$i2=セルのX座標
$i3=セルのY座標
です。
「$f1」の「f」はfloatを意味してるっぽいです。
ここを最初「$i1」としてたら出力結果が整数にまるめられちゃって、if文で小数点ダメなのかって諦めかけてしまいました。。

この文は、
$f1が0.001より大きかったら「$i2 $i3 $f1 bang」というリストを返し、
そうでない時は「10 7.5 0. bang」というリストを返します。
「10 7.5 0.」は真ん中に来させるための値です。
「bang」はその後のcounterを動かすためのものです。

4.表示用Matrixの作成
300個のパーティクルに使う座標を格納するためのMatrixを作ります。
サイズは300x1です。XYZの値があるのでplaneは3つです。
1つめのplaneにX座標、2つめにY座標、3つめにZ座標を格納します。

その前に「setcell $1 0 val $2 $3 $4」というメッセージを作り、このMatrixへ渡してあげることで各セルへ値を入れていきます。

その前の部分では各値の調整をし、格納するセルのX座標を「counter」を使って制御して
packでリストにまとめています。
このへんはすごく頭を使いました。もっと楽な方法、速い方法があるはず。

5.動きをスムーズに。
「4」のMatrixを「jit.gl.mesh」に渡す時に「jit.slide」を通すことで、位置がパッと変わるのではなく、滑らかに動くようにします。
@slide_upはおそらく値が大きくなる時の変化の速さ、
@slide_downはおそらく値が小さくなる時の変化の速さだと思います。
よくFlashで簡単なイージングをかける時に、
this._x += (_xmouse - this._x) / 10;
などとしたりしますが、この式の「10」に相当するような感じです。
つまり値が小さいほど動きは速くなり、大きいほど遅くなります。

という感じで作ってみましたが、実際に動かしてみると赤よりもオレンジや黄色に反応しやすい。。
カメラの性能もあるけど映像が暗くなってしまうので、単に赤いものだと暗くなりやすいっぽい。黄色とかオレンジのほうが明るいので取得しやすい。
その前に赤色検知のやり方も微妙なんだけども。

カメラはどういうのがいいのかねー。

| | コメント (0) | トラックバック (0)

2009年6月 5日 (金)

Jitterで赤色検知

jit.exprを使ってカメラの映像の赤色検知をしてみました。
jit.exprはサンプルとかでよく使われてるけど意味が分かりにくい。
実験してみてやっとちょっとだけ分かった気がします。

Jitter12

<カメラの映像取得>
「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の値を見れば赤色部分が分かるのでそれを
使えばいいのかなと思います。

| | コメント (0) | トラックバック (0)

«MAX/MSP+Jitter勉強中