AS3とWebカムが繋ぐおっぱいと私
昨日、既に完成の域に達していると思われていた2Dおっぱいシミュレーターを軽々上回る次世代シミュレーターを自ら公開して世界を獲ったつもりでいたのに、世間様に華麗にスルーされてたいへん寂しい思いしている今日この頃です。
が、そんなことはさておき、Flashを使うといとも簡単にWebカムから映像を取り込んで処理できることが分かり感動したので、以下そのやり方+αを書いてみる。まぁ、前半はAdobeのサンプルそのままだけど。
まず、映像を取り込んで表示するとこ
import flash.media.Camera; import flash.media.Video; var video:Video; var camera:Camera = Camera.getCamera(); if (camera != null) { video = new Video(camera.width, camera.height); video.attachCamera(camera); video.x = camera.width; addChildAt(video, 0); }
こんだけ。
これでWebカムで映してる映像がFlash上に表示される
左の方になんかあるけど、今はとりあえずシカトだ。
で、今表示されている画像をビットマップデータとして取り込む。
簡単。
var bitmapData:BitmapData = new BitmapData(camera.width, camera.height); baseData.draw(video);
次、取り込んだ画像をグレースケールにする。
色を変換するためのフィルタがあるのでそれ使って適当に。
var grayBitmapData:BitmapData = new BitmapData(bitmapData.width, bitmapData.height); grayBitmapData.applyFilter(bitmapData, bitmapData.rect, new Point(0, 0), new ColorMatrixFilter([1/3, 1/3, 1/3, 0, 0, 1/3, 1/3, 1/3, 0, 0, 1/3, 1/3, 1/3, 0, 0, 0, 0, 0, 255, 0]));
んで、ある閾値で二値に変換。
これも便利なメソッドが最初から用意されてる。
var threshold:uint = 0x30; var bicolorBitmapData:BitmapData = new BitmapData( grayBitmapData.width, grayBitmapData.height, false, 0xFFFFFFFF ); bicolorBitmapData.threshold( grayBitmapData, grayBitmapData.rect, new Point(0, 0), "<=", threshold, 0xFF000000, 0xFF, false );
あとは白くなった部分で、X座標が一番小さいとこにBox2Dで円とか置いてやれば
var minW:int = camera.width; var minH:int = 0; for (w = 0; w < bicolorBitmapData.width; w++) { for (h = 0; h < bicolorBitmapData.height; h++) { if (bicolorBitmapData.getPixel(w, h) != 0) { if (w < minW) { minW = w; minH = h; } } } } var circleDef:b2CircleDef = new b2CircleDef(); circleDef.radius = 10; handBodyDef.AddShape(circleDef); handBodyDef.position.Set(minW + radius / 2, minH); world.CreateBody(handBodyDef);
いうことで、なかなか幸せな気持ちになれるから、Webカム持ってる人は是非触ってみてよ。
→ 次世代おっぱいシミュレーター ←