Professional Documents
Culture Documents
/**
* Developer's Note:
* 1. Please note, that it would actually be better (i.e. easier) to use a coloured markers
* (such as complete RED or BLUE), then it would be much easier to detect the marker in the image!
* Then you could filter using a threshold = 0xCC0000 for a red marker, or similar.
* 2. Note for the current application: Try not having a dark background! Use a bright background instead,
* which makes it easier to detect the marker (reduces flickering).
* 3. There are many parts of the code that can be optimized. Please tell me your improvements!
* 4. I used 'lockers' (Booleans) to prevent the access to methods, when it is doing the image processing.
* Maybe this is not necessary.
*/
// IMPORTS
import de.firstai.cameraClass;
import de.firstai.imageClassOpt;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import fl.controls.Slider;
import fl.events.SliderEvent;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.Cube;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.materials.MaterialsList;
import org.papervision3d.materials.ColorMaterial;
// init checkboxes
cboxBinarize.label = "binarize";
cboxBinarize.selected = false;
cboxMarkRegions.label = "mark regions";
cboxMarkRegions.selected = false;
cboxShowExtract.label = "show extract";
cboxShowExtract.selected = false;
cboxEdgeDetect.label = "edge detection";
cboxEdgeDetect.selected = false;
cboxTrack.label = "animation1";
cboxTrack.selected = false;
cboxTrack2.label = "animation2";
cboxTrack2.selected = false;
cboxTrack3.label = "animation3";
cboxTrack3.selected = false;
// shows up if no webcam is found
alertWC.visible = false;
main.fla — Printed on 19.07.2008, 08:51:20 — Page 2
/* PREPARE MARKERS */
// create loaders, each one for a marker (to display on screen according to analysis)
var imgMarker0:Loader = new Loader();
var imgMarker1:Loader = new Loader();
var imgMarker2:Loader = new Loader();
var imgMarker3:Loader = new Loader();
imgMarker0.load(new URLRequest("assets/marker/00.png"));
imgMarker1.load(new URLRequest("assets/marker/01.png"));
imgMarker2.load(new URLRequest("assets/marker/02.png"));
imgMarker3.load(new URLRequest("assets/marker/03.png"));
imgMarker0.x = imgMarker1.x = imgMarker2.x = imgMarker3.x = 320 + 10 + 10;
imgMarker0.y = imgMarker1.y = imgMarker2.y = imgMarker3.y = 30;
imgMarker0.visible = imgMarker1.visible = imgMarker2.visible = imgMarker3.visible = false;
addChild(imgMarker0);
addChild(imgMarker1);
addChild(imgMarker2);
addChild(imgMarker3);
/* Marker END */
var myMaterials:Object;
var container:Sprite;
var scene:Scene3D;
var camera:Camera3D;
var rootNode:DisplayObject3D;
function init(e:Event):void {
trace("#INIT\nVideo started:",e,"\n");
video.removeEventListener(Event.ACTIVATE, init);
cam.camera.addEventListener(ActivityEvent.ACTIVITY,activated);
// slider component
sliThreshold.liveDragging = true;
sliThreshold.minimum = 0x000000;
sliThreshold.maximum = 0xAAAAAA;
sliThreshold.value = threshold;
sliThreshold.tickInterval = 0x222222;
sliThreshold.addEventListener(SliderEvent.CHANGE, changeHandler);
} // end of else
// Program controls
// first run check and lock variable to prevent false access
var firstRun:Boolean = true;
var busy:Boolean = true;
var alreadyOnStageBin:Boolean, alreadyOnStageReg:Boolean, alreadyOnStageExtr:Boolean, alreadyOnStageEdge
:Boolean, alreadyOnStageTrack:Boolean = false;
var extractInWork:Boolean = false;
var rotaX:int, rotaY:int, rotaZ:int;
function pullCamImage(e:Event):void {
if (!busy) {
trace("# processing");
// lock image for processing
busy=true;
// mark different regions in image with different colors and get number of labels
bmpdRegions.draw(bmpdBlackWhite);
labels = imgProc.markRegions(bmpdRegions);
// create bounding boxes around coloured areas, extract marker
main.fla — Printed on 19.07.2008, 08:51:20 — Page 5
if (!extractInWork) {
extractInWork = true;
bmpdMarkerExtract.draw(imgProc.extractMarker(bmpdRegions, labels));
extractInWork = false;
}
if (cboxTrack3.selected) {
rootNode.rotationX += rotaX;
rootNode.rotationY += rotaY;
rootNode.rotationZ += rotaZ;
// render the camera to see the changes
scene.renderCamera( camera );
}
busy = false;
}
function analyzeMarkerResult(image:BitmapData):void {
var countWhite:int, countColor:int = 0;
var ratioWhite:Number = 0;
// compare values with values of the standard markers (which has been tested before)
if ( (ratioWhite > 0.50) && (ratioWhite <= 0.75) && (!imgMarker3.visible) ) {
imgMarker3.visible = true; // white box
}
else if ( (ratioWhite > 0.22) && (ratioWhite <= 0.50) && (!imgMarker1.visible)) {
imgMarker2.visible = true; // cross
}
else if ( (ratioWhite > 0.10) && (ratioWhite <= 0.22) && (!imgMarker2.visible)) {
imgMarker1.visible = true; // big point
}
else if ( (ratioWhite > 0.01) && (ratioWhite <= 0.10)&& (!imgMarker0.visible) ){
imgMarker0.visible = true; // small point
}
}
}