flash: 2005年11月アーカイブ
赤い折り紙を検出してる様子。赤色を検出して、その重心を割り出す。
ラベリング処理などは行っていないので複数の物体があるときはその複数の物体の重心が表示される。
swf -- flashplayer8以上,webcam必須 ※遅いパソコンだと固まるかも.......試してません。
赤色の検出なんか簡単だろうと素人考えで思っていたのだがそうではなかった.....
折り紙の赤を検出しようと思ったのだけれど普通に色域を指定してやろうとしたら
うまくいかなかったので我流で検出している。
以下その部分のソースコード
my_bd.draw(my_video); green_bd.copyChannel(my_bd,my_rect,my_pt,2,1); blue_bd.copyChannel(my_bd,my_rect,my_pt,3,1); blue_bd.draw(green_bd, new Matrix(), new ColorTransform(), 'lighten'); //ブルーとグリーンを合成。明るい方の値が優先される。 my_bd.draw(blue_bd, new Matrix(), new ColorTransform(), 'subtract'); /*元の画像の赤色から他の色を合成した値を引く。 この際、赤-他の色がマイナスの値をとらないようにdifferenceではなく、subtractをつかう。 */ my_bd.applyFilter(my_bd, my_rect, null, noiseReduction); my_bd.threshold(my_bd, my_rect, my_pt, '>', 0xff500000,0xffffffff); my_bd.threshold(my_bd, my_rect, my_pt, '!=', 0xffffffff, 0xff000000); /* ここで赤の値が高い物を白に置き換える。閾値は0xff500000としとく。 (環境によって変化させる必要あり)その後二値化処理(白以外は黒に) */
こんなので本当にいいのか?一応できているけどもっと簡単にできるはず。
重心の検出部分は
var x=0
var y=0
var count=0
//重心を求める際のx y と標本の数を入れるcountの定義
for(i=0 ; i < my_cam.width ; i=i+5){
//5pixel刻みにカメラの画像の横の長さまで
for(e=0 ; e < my_cam.height ; e=e+5){
//5pixel刻みにカメラの画像の縦の高さまで
if(0 != my_bd.getPixel(i,e)){
//もし画素が黒じゃなかったら
x+=i;
//その画素のiをxに足す
y+=e;
//その画素のeをに足す
count++;
//標本した画素の数を記録
}
}
}
/*
上のfor文のあとに
x/count
y/count
を求めることによって重心の座標が求まる。
*/
と適当に書いている。
今日はとりあえずここまででおしまい。
ノイズをとるためにmedian filterでも入れるかな。
ExternalInterface - Macromedia Flex 2.0 MXML and ActionScript Language Reference
Macromediaによるflash.external.ExternalInterface とC# を使った連携のサンプルの情報
ソース元
FlexCoder - Flex 2.0 と C#の連携より
通信のシリアライズ化まで踏み込んだサンプルはプログラミング力が貧弱な僕にとってかなりうれしい。
Macromedia - Developer Center : Embedding and Communicating with the Macromedia Flash Player in C# Windows Applications
や
sappari.org - C#の中にFlashを埋め込む
にならぶためになる情報
1.Macromedia - Flash Media Server 2から本体をダウンロードしてインストールする。
2.Flash Media Server 2 ComponentsをMacromedia - Developer Center : Flash Media Server 2 Componentsからダウンロード
3.zipの中に入っているCommunicationComponents.flaをC:\Program Files\Macromedia\Flash 8\ja\Configuration\Componentsディレクトリ以下にコピー(win flash8 使用の場合)
4.zipの中に入っているscriptlibフォルダの中身をC:\Program Files\Macromedia\Flash Media Server 2\scriptlib内にコピー、元々あるファイルを上書きする。
実装の苦労で苦い思い出ばかりが残る Flash Communication Serverですが、バージョンアップしてMacromedia Flash Media Server 2になったようです。発売日は2005年11月9日とプレスリリースされていましたが、どうやら11月24日に発売延期されていたみたいでした。
(2005/11/23日にMacromedia japanのページにて確認)
バックエンドシステムとの連携 newFlash Media Server 2 は Remoting 、 ファイルオブジェクト、XML オブジェクト、ソケット、Jabber® XML スト リームを含む各種ストリームをサポート しているので、アプリケーションサーバーとさまざまな方法で連携できます。 また、メタデータの情報を取得するため にメディアアセット管理システムとも連 携できます。-Macromedia - Flash Media Server : 機能より引用
新機能としては、On2 VP6 コーデックで録画できるようになったこともうれしいし、上記の引用内容のようにJabberにも対応したことが気になる。最近Google Talkにも採用されたしね。
自分でおもしろいビデオを撮りながら、すぐに友達に公開したいときにはRssではなくてIMにブロードキャストした方がおもしろい気もする。最近のニュー速VIPもその傾向にはしってる(「今から~するから」とスレたてて、アンカー指定で命令実行系)からね。オンデマンド的なVideo配信ではなくて、トラジションとかも作れるようになったんだし、インタラクティブなオンラインvideo作成編集環境とかFLASHで出来るようになるといいなぁ。というかそのためのJabber対応なんだろうけど。
Flash Media Server コンポーネントはここからダウンロードできる。
FLASHでWEBCAMを使った動きの検出をしてみた。
参考はFLASH 8 : threshold() >> Motion detection... - jeanphiBlog
ここにあるソースを参考に、二値化処理に注目して勉強した。
Flash でwebcam を使った動きの検出 swf -- flashplayer8以上,webcam必須

今回のPointは
now_bd.draw(before_bd, new Matrix(), new ColorTransform(), 'difference');
now_bd.threshold(now_bd, my_rect, my_pt, '>', 0xff111111, 0xffffffff);
の処理。
drawメソッドを呼ぶ際にblendModeObjectをdifference指定してbefore_bdとnow_bdを合成する。diffrerenceは明るい色から暗い色を引くモードなので、差分がない部分は0x000000になる。その後に0xff111111(黒にちかい)を閾値とし0xffffffff (白) 差があるところを白くすることで二値化処理をしている。
二値化処理した後ノイズが乗るのでどうしたらいいのか勉強中。
ColorMatrixFilter()とConvolutionFilter()が難解で明日起きたら忘れそうなので覚え書き。
ColorMatrixFilter()について
カラーモデル変換式 RGB to YMC・YMCK・HSV・HLS・YCbCr(YUV,YCC)・XYZ・YUV・YIQ
ConvolutionFilter()について
コンボリューション行列
エッジ検出のためのフィルタは下のマトリックスを使う。
-1-1-1
-1 8 -1
-1-1-1
flashを使ってwebcamで映像を入力するといつも汚くなって困ってしまっていた。
いろいろしらべていたら Camera オブジェクトの .setMode()メソッドで入力解像度を操作できることを知った。
メソッドの使い方は
public setMode([width:Number], [height:Number], [fps:Number], [favorArea:Boolean]) : Voidパラメータ
width:Number (オプション) - 必要なキャプチャの幅 (ピクセル単位)。デフォルト値は 160 です。
height:Number (オプション) - 必要なキャプチャの高さ (ピクセル単位)。デフォルト値は 120 です。
fps:Number (オプション) - 必要なデータキャプチャレート (1 秒あたりのフレーム数)。デフォルト値は 15 です。
favorArea:Boolean (オプション) - 指定要件に合うネイティブモードがカメラにない場合に、幅、高さ、フレームレートをどのように操作するかを指定するブール値。デフォルト値は true で、キャプチャサイズを維持することを示します。このパラメータを使用すると、width 値と height 値に最も近いモードが選択されます。ただし、これによりフレームレートが低下し、パフォーマンスに悪影響を及ぼすことがあります。カメラの高さと幅よりも最大フレームレートを優先するには、favorArea パラメータに false を指定します。
とあったので、.setMode()メソッドを使った簡単なサンプルをつくって、早速実験してみた。
.setMode()メソッド検証用SWF -- flashplayer8以上,webcam必須
※使用しているWEBCAMによっては最大解像度がそれぞれ違うので、640 x 480 以上は表示できない場合あり。
.setMode()メソッドをつかって、それぞれ 160 x 120 、1280 x 960 の解像度でキャプチャーしてみた。画面の出力は640 x 480 で固定。
![]()
flashのデフォルト入力値である160 x 120の解像度のキャプチャー画像。かなり画像が荒い。
![]()
1280 x 960の解像度のキャプチャー画像 画像はきれいになっているがfpsが8まで落ちている。
いろいろ実験してみると、帯域の問題が結構顕著に表れた。
1280 x 960 ではfpsが8までおちてしまいすこしかくかくした感じになってしまう。
960 x 720だと 15fpsくらいで再生できるのでローカルでwebcamの入力を使うときはこのくらいの解像度がベストという気がした。
詳しいメソッドのつかいかたやサンプルソースなどはMacromediaのサイトへ
flickrで人を探す、プログラムにエラーが起きたときに変な写真を拾ってくる意味がわかった。
flickrにundefinedってユーザーがいるからだ。
http://www.flickr.com/photos/undefined/
先日のに続いてついでに発掘up。
なぜかAnd検索がうまくいかなかったが、理由はいまだにわからない。
ちょっと前にflickr apiをいじって作ったFLASHがあったので、バグを少しなおして公開
下のテキストエリアにFlickrのusernameを入れるとその人の画像がランダムで表示される。
FLickrはアマゾンや他のwebサービスとちがって、FLashのクロスドメイン問題に対応している。
このページでFlickr API Keysを登録する際に
Domain For Flash applications:の蘭に自分のFLASHをおきたいドメインを入力することで、そのドメインにおいたswfファイルがflickr.comへ通信することが可能になる。
Flickr APIのページで公開されているflickr_api (doc)を使って使ったのだがバージョンが古いのかAPI自体にバグが多かったので、ソースのASファイルに潜って直して使った。
話は変わるが、ActionScriptでなぜかときどきloadMovieが効かない時があるのはなぜ?
ロードした容量をみてもロードは完了しているはずなのに表示されないことがある。
なぜだろう。
