flash on 2011-2-25

by tepe
webCam
♥0 | Line 168 | Modified 2011-02-28 18:14:10 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ckB6
 */

// forked from keno42's マーカー認識のための二値化
package  
{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.media.*;
    import flash.net.*;
    import flash.system.LoaderContext;
    import flash.system.Security;
    import frocessing.color.ColorHSV;
    import com.bit101.components.HUISlider;
    import com.bit101.components.Panel;
    import com.bit101.components.PushButton;
    
    public class Main extends Sprite
    {
        private var camera:Camera;
        private var video:Video;
        private var bd:BitmapData;
        
        

        private const WIDTH:int = 232;
        private const HEIGHT:int = 232;
        
        private var bitmapA:Bitmap;
        private var bitmapB:Bitmap;
        //private var bd:BitmapData;
        
        private var btn:PushButton;
        private var slider:HUISlider;
        private var panel:Panel;
        //private var valA:Number;
        private var pixelCol:uint; 
        
        private var file:FileReference = new FileReference();
 
        public function Main()
        {
            panel = new Panel(this);
            panel.width = panel.height = 465;
            
            btn = new PushButton(this,0,10,"WebCam ON");
            btn.x = 150;
            btn.y = 270;
            btn.addEventListener(MouseEvent.MOUSE_UP, startCamera);
            
            btn = new PushButton(this,0,10,"File OPEN");
            btn.x = 150;
            btn.y = 249;
            btn.addEventListener(MouseEvent.MOUSE_UP, fileOpen);
            
            Security.loadPolicyFile("http://farm3.static.flickr.com/crossdomain.xml");
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
            loader.load(new URLRequest("http://farm3.static.flickr.com/2133/1991035050_f169d55a13.jpg"), new LoaderContext(true));
 
            
        }
        
        private function fileOpen(e:MouseEvent):void{
            file.addEventListener(Event.SELECT,onSelect);
            file.browse();
        }
        private function onSelect(e:Event):void{
            file.removeEventListener(Event.SELECT,onSelect);
            file.addEventListener(Event.COMPLETE,onComplete);
            file.load();
        }

        
        private function onComplete(e:Event):void {
            var myLoader:Loader = new Loader();
            myLoader.loadBytes( file.data );
            myLoader.contentLoaderInfo.addEventListener( Event.INIT, initLoaded );
        }
        private function initLoaded(evt:Event):void{
           // bd = Bitmap(evt.target.content);
            var matrix:Matrix = new Matrix();
            matrix.scale(WIDTH / evt.target.width, HEIGHT / evt.target.height);
 
            bd = new BitmapData(WIDTH, HEIGHT);
            bd.draw(evt.target.content, matrix);
            
            bitmapA = new Bitmap(bd);
            panel.content.addChild(bitmapA);
            var destbd:BitmapData = bd.clone();
            bitmapB = new Bitmap(destbd);
            bitmapB.x = WIDTH + 1;
            panel.content.addChild(bitmapB);
            
            /*
            var bmp:Bitmap = Bitmap( evt.target.content );
            if(evt.target.content){
                if((bmp.width >WIDTH)||(bmp.height >HEIGHT)){
                    if( bmp.width > bmp.height){
                        var wRatio:Number = HEIGHT / bmp.width;
                        bmp.width = HEIGHT;
                        bmp.height *= wRatio;
                    } else {
                        var hRatio:Number = HEIGHT / bmp.height;
                        bmp.height = HEIGHT;
                        bmp.height *= hRatio;
                    }
                }
                
            }
            */

        }

        
        private function startCamera(e:MouseEvent):void{
            camera = Camera.getCamera();
            if ( camera == null ) {
            } else {
                start();
                stage.removeEventListener(Event.ENTER_FRAME,onFrame);
            }
            
        }

        
        private function start():void {
            camera.setMode(WIDTH,HEIGHT, 60);//カメラ設定 width, height, frame
            video = new Video(WIDTH,HEIGHT);//ビデオサイズ width, height
            video.attachCamera(camera);
            bd = new BitmapData(video.width, video.height);//ビデオサイズのビットマップデータ
            this.addChild( video );
            this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        //毎フレーム処理
        private function onEnterFrame(e:Event):void {
            bd.lock();
            bd.draw(video);//ビデオデータ取得

            bd.unlock();
            search(bd,pixelCol,slider.value);
        }
 
        private function initHandler(event:Event):void
        {
            var loader:Loader = event.currentTarget.loader;
 
            var matrix:Matrix = new Matrix();
            matrix.scale(WIDTH / loader.width, HEIGHT / loader.height);
 
            bd = new BitmapData(WIDTH, HEIGHT);
            bd.draw(loader, matrix);
            
            bitmapA = new Bitmap(bd);
            panel.content.addChild(bitmapA);
            var destbd:BitmapData = bd.clone();
            bitmapB = new Bitmap(destbd);
            bitmapB.x = WIDTH + 1;
            panel.content.addChild(bitmapB);
            
            slider = new HUISlider(this, 5, 300, "distance");
            slider.value = 60;
            slider.minimum = 0;
            slider.maximum = 400;
            
            stage.addEventListener(MouseEvent.CLICK, onMouseClick);
            stage.addEventListener(Event.ENTER_FRAME,onFrame);
            
        }
        
        private function onFrame(event:Event):void{
                search(bd,pixelCol,slider.value);
        }

        
        private function onMouseClick(event:MouseEvent):void
        {
            if (!bitmapA.hitTestPoint(mouseX, mouseY)) return;
            bitmapB.bitmapData = bd.clone();
            
            pixelCol = bd.getPixel(mouseX, mouseY);
            search(bd,pixelCol,slider.value);
        }
        
        //カラーフィルター
        private function search( bd:BitmapData, c:int, val:Number = 50 ):void
        {    
            var colorA:ColorHSV = new ColorHSV();
            var colorB:ColorHSV = new ColorHSV();
            colorA.value = c;//基準色
            
            //ビットマップの処理
            for (var y:int = 0; y < bd.height; y++)// Y軸
            {
                for (var x:int = 0; x < bd.width; x++)// X軸
                {
                    colorB.value = bd.getPixel(x, y);//ピクセルの色取得
                    
                    var r:int = colorA.r - colorB.r;//赤成分
                    var g:int = colorA.g - colorB.g;//緑成分
                    var b:int = colorA.b - colorB.b;//青成分
                    //指定ピクセルの閾値判定
                    if (val < Math.sqrt(r * r + g * g + b * b)){
                        bitmapB.bitmapData.setPixel(x, y, 0xFFFFFF);
                    }
                    else{
                        bitmapB.bitmapData.setPixel(x, y, colorB.value);
                    }

                    
                }
            }
        }
        
   
        private function search2( bd:BitmapData, c:int, val:Number = 50 ):void
        {    
            var colorA:ColorHSV = new ColorHSV();
            var colorB:ColorHSV = new ColorHSV();
            colorA.value = c;//基準色
            
            //ビットマップの処理
            for (var y:int = 0; y < bd.height; y++)// Y軸
            {
                for (var x:int = 0; x < bd.width; x++)// X軸
                {
                    colorB.value = bd.getPixel(x, y);//ピクセルの色取得
                    
                    var r:int = colorA.r - colorB.r;//赤成分
                    var g:int = colorA.g - colorB.g;//緑成分
                    var b:int = colorA.b - colorB.b;//青成分
                    //指定ピクセルの閾値判定
                    if (val < Math.sqrt(r * r + g * g + b * b)){
                        bitmapB.bitmapData.setPixel(x, y, 0xFFFFFF);
                    }
                    else{
                        bitmapB.bitmapData.setPixel(x, y, colorB.value);
                    }

                    
                }
            }
        }
        
    }
}