<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
// public var xBitmap:Bitmap;
private var bitmapData:BitmapData;
private var searchColorA:uint = 0xFFFFFF;
private var searchColorB:uint = 0x000000;
private function init():void {
var camera:Camera = Camera.getCamera();
camera.setMode( 640, 480, 25, false );
if (camera) {
video.attachCamera(camera);
} else {
Alert.show("You don't seem to have a camera.");
}
this.addEventListener(Event.ENTER_FRAME, handleActivity );
// camera.addEventListener(ActivityEvent.ACTIVITY, handleActivity );
var g:Graphics = red.graphics;
g.lineStyle(1, 0xFF0000, 0.75 );
g.beginFill(0xFF0000, 0.75 );
g.drawCircle(0, 0, 10);
g.endFill();
g = green.graphics;
g.lineStyle(1, 0x00FF00, 0.75);
g.beginFill(0x00FF00, 0.75);
g.drawCircle(0, 0, 10);
g.endFill();
}
private function askPermission( ) : void {
// Security.showSettings( SecurityPanel.PRIVACY );
}
private function handleActivity( event:Event ) : void {
if (bitmapData == null) {
bitmapData = new BitmapData( video.width, video.height );
// bData.draw( video );
// xBitmap = new Bitmap( bData );
// target.source = xBitmap;
}
bitmapData.draw( video );
// now that we have some nice data in the bitmapData property, let's proceed
var matchedA_x:Array = new Array();
var matchedA_y:Array = new Array();
var matchedB_x:Array = new Array();
var matchedB_y:Array = new Array();
for (var y:int = 0; y < bitmapData.height; y++) {
for (var x:int = 0; x < bitmapData.width; x++) {
if (match(searchColorA, bitmapData.getPixel(x, y) )) {
matchedA_x.push( x );
matchedA_y.push( y);
} else if (match( searchColorB, bitmapData.getPixel( x, y ))) {
matchedB_x.push( x );
matchedB_y.push( y );
}
}
}
var a_avg_x:int = 0;
var a_avg_y:int = 0;
var b_avg_x:int = 0;
var b_avg_y:int = 0;
var i:int;
if (matchedA_x.length > 0) {
for (i = 0; i < matchedA_x.length; i++ ) {
a_avg_x = a_avg_x + matchedA_x[i];
a_avg_y = a_avg_y + matchedA_y[i];
}
a_avg_x = a_avg_x / matchedA_x.length;
a_avg_y = a_avg_y / matchedA_y.length;
}
if (matchedB_x.length > 0) {
for (i = 0; i < matchedB_x.length; i++) {
b_avg_x = b_avg_x + matchedB_x[i];
b_avg_y = b_avg_y + matchedB_y[i];
}
b_avg_x = b_avg_x / matchedB_x.length;
b_avg_y = b_avg_y / matchedB_x.length;
}
// move the canvases
red.x = a_avg_x;
red.y = a_avg_y;
green.x = b_avg_x;
green.y = b_avg_y;
}
private function setColor( event:MouseEvent ) : void {
var x:int = event.localX;
var y:int = event.localY;
searchColorA = bitmapData.getPixel( x, y );
}
private function setOtherColor( event:MouseEvent ) : void {
var x:int = event.localX;
var y:int = event.localY;
searchColorB = bitmapData.getPixel( x, y );
}
private function match( colorA:uint, colorB:uint ) : Boolean {
var limit:int = 20;
var sr:int = colorA >> 16 & 0xFF;
var sg:int = colorA >> 8 & 0xFF;
var sb:int = colorA & 0xFF;
var cr:int = colorB >> 16 & 0xFF;
var cg:int = colorB >> 8 & 0xFF;
var cb:int = colorB & 0xFF;
return cr > sr - limit && cr < sr + limit && cg > sg - limit && cg < sg + limit && cb > sb - limit && cb < sb + limit;
}
]]>
</mx:Script>
<mx:Canvas>
<mx:VideoDisplay id="video" height="480" width="640" creationComplete="askPermission()" rightClick="setOtherColor( event )" click="setColor( event )"/>
<!-- <mx:Image id="target" height="640" width="480"/> -->
<mx:Canvas id="red"/>
<mx:Canvas id="green"/>
</mx:Canvas>
<mx:Button id="button"
label="Attach Camera"
click="init();" />
</mx:WindowedApplication>