package
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.media.Video;
import flash.net.URLRequest;
import gs.TweenLite;
import gs.easing.*;
import com.quasimondo.bitmapdata.CameraBitmap;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.text.TextField;
import jp.maaash.ObjectDetection.ObjectDetector;
import jp.maaash.ObjectDetection.ObjectDetectorEvent;
import jp.maaash.ObjectDetection.ObjectDetectorOptions;
public class FaceDetector_Camera extends Sprite
{
private var detector :ObjectDetector;
private var options :ObjectDetectorOptions;
private var view :Sprite;
private var faceRectContainer :Sprite;
private var tf :TextField;
private var camera:CameraBitmap;
private var detectionMap:BitmapData;
private var drawMatrix:Matrix;
private var scaleFactor:int = 4;
private var w:int = 640;
private var h:int = 480;
public var Mask:Loader = new Loader();
public var oakley_th:Loader = new Loader();
public var oakley2_th:Loader = new Loader();
public var rayban_th:Loader = new Loader();
public var Mask_rabbits_th:Loader = new Loader();
public var MCoakley_th:MovieClip = new MovieClip();
public var MCoakley2_th:MovieClip = new MovieClip();
public var MCrayban_th:MovieClip = new MovieClip();
public var MCMask_rabbits_th:MovieClip = new MovieClip();
private var lastTimer:int = 0;
public function FaceDetector_Camera() {
initUI();
initDetector();
//Mask.load(new URLRequest("oakley2.png"));
Mask.load(new URLRequest("oakley.png"));
//Mask.load(new URLRequest("rayban.png"));
//Mask.load(new URLRequest("Mask_rabbits.png"));
addChild(Mask);
addChild(MCoakley_th);
addChild(MCoakley2_th);
addChild(MCrayban_th);
addChild(MCMask_rabbits_th);
}
private function initUI():void{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
view = new Sprite;
addChild(view);
camera = new CameraBitmap( w, h, 15 );
camera.addEventListener( Event.RENDER, cameraReadyHandler );
view.addChild( new Bitmap( camera.bitmapData ) );
detectionMap = new BitmapData( w / scaleFactor, h / scaleFactor, false, 0 );
drawMatrix = new Matrix( 1/ scaleFactor, 0, 0, 1 / scaleFactor );
faceRectContainer = new Sprite;
view.addChild( faceRectContainer );
oakley_th.load(new URLRequest("oakley_th.png"));
MCoakley_th.addChild(oakley_th);
MCoakley_th.x = 0;
MCoakley_th.y = stage.height - 64;
MCoakley_th.name = "oakley.png"
MCoakley_th.buttonMode = true
MCoakley_th.addEventListener(MouseEvent.CLICK, click);
oakley2_th.load(new URLRequest("oakley2_th.png"));
MCoakley2_th.addChild(oakley2_th);
MCoakley2_th.x = 68;
MCoakley2_th.y = stage.height - 64;
MCoakley2_th.name = "oakley2.png"
MCoakley2_th.buttonMode = true
MCoakley2_th.addEventListener(MouseEvent.CLICK, click);
rayban_th.load(new URLRequest("rayban_th.png"));
MCrayban_th.addChild(rayban_th);
MCrayban_th.x = 136
MCrayban_th.y = stage.height - 64;
MCrayban_th.name = "rayban.png"
MCrayban_th.buttonMode = true
MCrayban_th.addEventListener(MouseEvent.CLICK, click);
Mask_rabbits_th.load(new URLRequest("Mask_rabbits_th.png"));
MCMask_rabbits_th.addChild(Mask_rabbits_th);
MCMask_rabbits_th.x = 204
MCMask_rabbits_th.y = stage.height - 64;
MCMask_rabbits_th.name = "Mask_rabbits.png"
MCMask_rabbits_th.buttonMode = true
MCMask_rabbits_th.addEventListener(MouseEvent.CLICK, click);
}
private function click(e:MouseEvent):void {
Mask.unload();
Mask.load(new URLRequest(e.currentTarget.name));
trace("target = " + e.currentTarget.name);
}
private function cameraReadyHandler( event:Event ):void
{
detectionMap.draw(camera.bitmapData,drawMatrix,null,"normal",null,true);
detector.detect( detectionMap );
}
private function initDetector():void
{
detector = new ObjectDetector();
var options:ObjectDetectorOptions = new ObjectDetectorOptions();
options.min_size = 30;
detector.options = options;
detector.addEventListener(ObjectDetectorEvent.DETECTION_COMPLETE, detectionHandler );
}
private function detectionHandler( e :ObjectDetectorEvent ):void
{
var g :Graphics = faceRectContainer.graphics;
g.clear();
if( e.rects ){
g.lineStyle( 2 ); // black 2pix
e.rects.forEach( function( r :Rectangle, idx :int, arr :Array ) :void {
//g.drawRect( r.x * scaleFactor, r.y * scaleFactor, r.width * scaleFactor, r.height * scaleFactor );
var MaskSX:Number = (r.width * scaleFactor)*2
var MaskSY:Number = (r.height * scaleFactor)*2
var MaskX:Number = 0
var MaskY:Number = 0
var HeadCenterX:Number = ((r.width / 2 )* scaleFactor) + (r.x * scaleFactor)
var HeadCenterY:Number = ((r.height / 2 )* scaleFactor) + (r.y * scaleFactor)
MaskX = HeadCenterX - (MaskSX / 2)
MaskY = HeadCenterY - (MaskSY /2)-64
TweenLite.to(Mask, 0.5, { x:MaskX, y:MaskY, width:MaskSX, height:MaskSY} )
});
}
}
}
}