< « 2009年04月 | main| 2009年06月 » >

大阪てら子 22 「webカメラで遊ぼう!」に参加してきました

FLASH勉強

2009年05月31日

大阪てら子 22 「webカメラで遊ぼう!」に参加してきました。
毎度ながら、スイマセン!的な発表なんですが、今回もスイマセンです。

今回やっておきたかったことは以下の2点。

  • Webカメラで撮った画像を保存。
  • シンプルな動体検知

こんなものを発表しました動画

Webカメラで撮った画像を保存

Flashのみで画像保存はFlash Player9の段階では不可能?みたいなので、サーバー側(php)で保存します。
※Flash Player10からはローカルファイルアクセス機能が出来るようになったので画像保存できるかもしれない。

1、BitmapDataをエンコードしてサーバーへ送信
2、サーバー側で画像保存
※サーバーはローカルにMAMPをインストールした環境を使用しました。(mac 0SX)

Flash→PHPの連携はパラメーターの引き渡しが簡単に出来るAMFPHPを使ってみました。エンコードに関しては、as3corelibよりPNGEncoderを使用しています。

主要部分のASスクリプト

package
{
	import com.adobe.images.PNGEncoder;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.net.NetConnection;
	import flash.net.Responder;
	import flash.utils.ByteArray;
	
	public class Test_amfphp extends Sprite
	{
		public function Test_amfphp()
		{
			//BitmapDataをエンコード
			var bmd:BitmapData = new BitmapData(100,100,false,0x0)
			var byteArray:ByteArray = PNGEncoder.encode(bmd);
			
			//AMFPHPのgateway.phpがある場所
			var gateway:String = "http://localhost/amfphp/gateway.php";
			
			//AMFPHPが返す値の受け皿を設定
			var responder:Responder = new Responder(_onResult,_onStatus);
			
			//つなげる。
			var connection:NetConnection = new NetConnection();
			connection.connect(gateway);
			
			//呼ぶ
			connection.call("PHPクラス名.メソッド名",responder,byteArray,"その他引数1","その他引数2");
		}
		
		private function _onResult($result:Object):void {
			trace("結果_" + $result);
		}
		
		private function _onStatus($status:Object):void {
			trace("ステータス_" + $status);
		}

	}
}

画像保存のphpスクリプト

class PngSave
{
    public function download($image,$dir)
    {
        $fileName = $dir."hae.png"; // ファイル名
        
        //方法1
        $fp = fopen($fileName, 'wb');
        fwrite($fp, $image->data);
        fclose($fp);
        
        //方法2 ブラウザからじゃないと上手くいかない?
        //$im = imagecreatefromstring ($image->data);
        //header('Content-Type: image/png');
        //header("Content-Disposition: attachment; filename=".$fileName);
        //imagepng($im);
        
        return $fileName;
    }
}

ActionScript側からAMFPHPにByteArrayを飛ばした時、$image->dataにデータが入ってます。※$imageと指定してハマりました。
参考:AMFPHP1.9b2でByteArrayをもらう、返す 

シンプルな動体検知

動体検知ですが、検知する場所を決めて、その場所のピクセルの色が一つ前の色と最新の色とで、 どれだけ変化しているか?で判断しています。
今回の場合、画面の左、上、右の3カ所に検知するポイントを置いて、そこのピクセルの色が一定以上変化したかどうか?で動体検知を行いました。

動体検知判断のASスクリプト

package
{
	import flash.display.Sprite;
	
	public class Test_ColorDiff extends Sprite
	{
		public function Test_ColorDiff()
		{
			//古い色と最新の色
			var color_old:uint = 0xFFFFFF;
			var color_new:uint = 0xFFFF00;
			
			//古い色をR,G,Bに分ける
			var color_old_arr:Array = [ 
				color_old >> 16 , 
				color_old >> 8 & 0xFF ,
				color_old & 0xFF ,
				];
			trace("old-R_" + color_old_arr[0]); //255
			trace("old-G_" + color_old_arr[1]); //255
			trace("old-B_" + color_old_arr[2]); //255
			
			//新しいい色をR,G,Bに分ける
			var color_new_arr:Array = [ 
				color_new >> 16 , 
				color_new >> 8 & 0xFF ,
				color_new & 0xFF ,
				];
			trace("new-R_" + color_new_arr[0]); //255
			trace("new-G_" + color_new_arr[1]); //255
			trace("new-B_" + color_new_arr[2]); //0
			
			//R,G,Bそれぞれ古い色と新しい色を比較し、threshold_valueの値以上に差が出たら「動いた」と見なす。
			var threshold_value:Number = 20;
			for(var i:Number = 0;i <= 2;i++ ){
				if(Math.abs(color_old_arr[i] - color_new_arr[i]) > threshold_value ) {
					trace("動いた!");
				}
			}
			
		}
	}
}

てな感じです。

大阪てら子 22 「webカメラで遊ぼう!」の感想

世の中広いわけで、凄いスクリプトを書く人、とても良いアイデアを持っている人を目のあたりにすると、 危機感というか、やべー状態になりました。

ということでこれからも精進していこうと思います。


USKさんが今回の様子をしっかりまとめてくださっています。

大阪てら子 22 「webカメラで遊ぼう!」@trace

それと、トンカさんが同様に動体検知されてました。
てら子に行ってきた!~大阪てら子 22 「webカメラで遊ぼう!」~@キテレツ荘
動体検知方法は、BlendMode.DIFFERENCEで古い情報と新しい情報の差分を取得する方法のようです。その方法は全く思いつかなかった!!

< « 2009年04月 | main| 2009年06月 » >
Adobe Flash CS3 詳細! ActionScript 3.0 入門ノート (DVD-ROM付)
クラスで書けるようになった。配列のpushとかspliceとかsliceとかややこしい部分の辞書代わりにも使ってます。XML関係もこれで覚えた。
ActionScript 3.0 アニメーション
vx,Math,cos,sinとか???な数学的な部分をこの本で理解できた気がします。逃げたいジャンルだけどFLASHに必須なジャンルなのよね。。
Adobe Flash CS3 詳細! ActionScript3.0入門ノート2 (CD-ROM付)
ActionScript応用への第一歩。ただこれを読む前に入門ノート1を先に読んでおいた方がよさそう。ASの世界が広がった気がする本です。
Flash Creative Workshop
FLASHを始めて右も左も分からない時に救世主となった本。FLASHサイト制作法がなるほど!っと。ActionScriptバリバリの人はスルー。
FLASH OOP for ActionScript 3.0
FLASHの「今の主流」を知ることが出来る本。筆者の方々は総勢10人以上でかつ現在活躍中の方々ばかりなんでミーハー的な読み方もありかも。