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カム持ってる人は是非触ってみてよ

次世代おっぱいシミュレーター