forked from: 動体検知のテスト

by tepe forked from 動体検知のテスト (diff: 1)
動体検知のテスト。
精度は微妙。
@author atsonic
♥0 | Line 86 | Modified 2014-05-25 10:30:31 | 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/40Uy
 */

// forked from atsonic's 動体検知のテスト
package
{
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.filters.ConvolutionFilter;
    /**
     * 動体検知のテスト。
     * 精度は微妙。
     * @author atsonic
     */
    public class FlashTest extends Sprite
    {
        private var cameraW:uint;
        private var cameraH:uint;
        private var _camera:Camera;
        private var _video:Video;
        private var _bmp:Bitmap;
        private var _bmd:BitmapData;
        private var _rect:Rectangle;
        private var _point:Point;
        private var _type:String;
        private var _typeArray:Array;
        private var _now:BitmapData;
        private var _old:BitmapData;
        private var _square:Sprite;
        private var _convolutionFilter:ConvolutionFilter;
        /**
         * constructor
         */
        public function FlashTest ()
        {
            cameraW = 465;
            cameraH = 465;
            _rect = new Rectangle(0, 0, cameraW, cameraH);
            _point = new Point(0, 0);
            _type = "normal";
            
            _camera = Camera.getCamera();
            if (_camera != null)
            {
                stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                _camera.setMode(cameraW / 2, cameraH / 2, 30);
                _video = new Video(cameraW, cameraH);
                _video.attachCamera(_camera);
            }
            else
            {
                trace("You need a camera.");
            }
            var array:Array = [1,  1,  1,
                           1,  16,  1,
                       1,  1,  1];
            _convolutionFilter = new ConvolutionFilter(3, 3, array);
            _convolutionFilter.bias = -(0x1000 + 0x100 * 6);

            _bmd = new BitmapData(cameraW, cameraH , false, 0xFFFFFF);
            _bmp = new Bitmap(_bmd);
            _bmp.x = (stage.stageWidth - cameraW) / 2;
            _bmp.y = (stage.stageHeight - cameraH) / 2;
            //_bmp.alpha = 0.8;
            addChild(_video);
            addChild(_bmp);
            _square = new Sprite();
            addChild(_square);
            _now = new BitmapData(cameraW, cameraH);
            _old = new BitmapData(cameraW, cameraH);
        }
        /**
         * enterFrameHandler
         * @param event Event
         */
        private function enterFrameHandler(event:Event):void
        {
            if (_video == null || _camera == null)
            {
                return;
            }
            if (_camera.muted == true)
            {
                return;
            }
            _now.draw(_video);
            _now.draw(_old, new Matrix(), new ColorTransform(), BlendMode.DIFFERENCE);
            _now.threshold(_now, _rect, _point, ">", 0xff111111, 0xffffffff);
            _now.applyFilter(_now, _rect, _point, _convolutionFilter);
            _old.draw(_video);
            
            _bmd.lock();
            _bmd.copyPixels(_now, _rect, _point);
            _bmd.unlock();
            /*
            var rect:Rectangle = _bmd.getColorBoundsRect( 0xFFFFFFFF, 0xFFFFFFFF, true );
            _square.graphics.clear();
            _square.graphics.lineStyle(1, 0xFF0000);
            _square.graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
            */
                        
        }
    }
}