본문 바로가기

Actionscript3.0

CustomTextMotion + MotionCapture


전에 만들어 놓았던 웹캡에서 받은 영상을 차(-) 연산하여 동작을 인식 하는 클래스를 (말이 동작인식이지 단순 차연산;;;)  컴포넌트 형태로 제공되는 CustomTextMotion 에 적용해 보았습니다.


주온이 생각나는 안습 캡쳐 사진;;;

 

 
  1. package motioncap {
  2.         import flash.media.Video;       
  3.         import flash.events.StatusEvent;       
  4.         import flash.media.Camera;     
  5.         import flash.display.MovieClip;
  6.         import flash.display.BitmapData;
  7.         import flash.geom.Matrix;
  8.         import flash.utils.Timer;
  9.         import flash.events.TimerEvent;
  10.         import flash.geom.Point;       
  11.        
  12.         /**
  13.          * @author dongkang 2008-02-25
  14.          */
  15.         public class MotionCapture extends MovieClip {
  16.                
  17.                 private var w:uint;
  18.                 private var h:uint;
  19.                 private var tolerance : Number;
  20.                 private var pixel:int;
  21.                 private var startbool:Boolean;
  22.                 private var cam : Camera;
  23.                 private var vid : Video;
  24.                 private var now:BitmapData;
  25.                 private var before:BitmapData;
  26.                 private var snaptimer:Timer;
  27.                 private var motiontimer:Timer;
  28.                 private var snapmat : Matrix;
  29.                 private var mainStage:Object;
  30.                 private var hit_arr:Array;
  31.                 private var fl_arr:Array;// 동작인식된 점의 저장 장소
  32.                 private var bbo:Boolean;
  33.                
  34.                
  35.                
  36.                 public function MotionCapture(_root:Object,_hit_arr:Array) {
  37.                         bbo = false;
  38.                         mainStage = _root;
  39.                         hit_arr = _hit_arr;                                    
  40.                         w = 480;
  41.                         h = 320;
  42.                         tolerance = 50;
  43.                         pixel  = 10;
  44.                        
  45.                         startbool = false;
  46.                        
  47.                         cam = Camera.getCamera();
  48.                         cam.addEventListener(StatusEvent.STATUS, statushandler);
  49.                        
  50.                         vid = new Video();
  51.                         vid.attachCamera(cam);
  52.                         vid.visible = false;
  53.                         fl_arr = new Array();
  54.                         snaptimer = new Timer(100);
  55.                         motiontimer = new Timer(3000);
  56.                        
  57.                 }
  58.                 private function statushandler(e:StatusEvent):void
  59.                 {
  60.                        
  61.                        
  62.                         if(cam.muted){return;}
  63.                        
  64.                         cam.setMode(320,240,26,false);
  65.                         mainStage.addChild(vid);
  66.                         initialize();   
  67.                        
  68.                         cam.removeEventListener(StatusEvent.STATUS, statushandler);
  69.                 }
  70.                 private function initialize():void
  71.                 {
  72.                         snaptimer.addEventListener("timer", timerhandler);
  73.                         snaptimer.start();
  74.                                        
  75.                                        
  76.                         motiontimer.addEventListener(TimerEvent.TIMER, onMotionCapture);
  77.                         motiontimer.start();
  78.                        
  79.                        
  80.                         snapmat = new Matrix();
  81.                         snapmat.scale(1.5,1.5);                        
  82.                         now = new BitmapData(w,h);             
  83.                        
  84.                         var tim:Timer = new Timer(3000,10);
  85.                         tim.start();
  86.                         tim.addEventListener("timer",timhandler);
  87.                         tim.addEventListener(TimerEvent.TIMER_COMPLETE, timCompletehandler);
  88.                                        
  89.                        
  90.                 }
  91.                 private function timCompletehandler(e:TimerEvent):void{
  92.                         //bbo = false;
  93.                        
  94.                 }
  95.                
  96.                 private function timhandler(e:TimerEvent):void
  97.                 {
  98.                         bbo = true;
  99.                                
  100.  
  101.                 }
  102.                  
  103.                        
  104.                 private function timerhandler(evt:TimerEvent):void
  105.                 {
  106.                         try{
  107.                
  108.                                
  109.                                 before = now.clone();
  110.                                 now.draw(vid,snapmat);
  111.                                
  112.                                
  113.                                 // 현재 snapshot 에 대한 픽셀을 저장한다.
  114.                                 var nc:uint = new uint();
  115.                        
  116.                                 // 색깔 채널값을 설정한다.
  117.                                 var nr:Number = new Number();
  118.                                 var ng:Number = new Number();
  119.                                 var nb:Number = new Number();
  120.                                 var nl:Number = new Number();
  121.                                 // 각 채널에 대한 똑같은 값 지정
  122.                                 var bc:uint = new uint();
  123.                                
  124.                                 var br:Number = new Number();
  125.                                 var bg:Number = new Number();
  126.                                 var bb:Number = new Number();
  127.                                 var bl:Number = new Number();
  128.                                
  129.                                 // 두 밝기에 대한 차이를 저장한다.
  130.                                 var d:Number = new Number();
  131.                                
  132.                                 for(var xR:int=w; xR > 0;xR-=pixel)
  133.                                 {
  134.                                         for(var yR:int=1;yR<h;yR+=pixel)
  135.                                         {
  136.                                                
  137.                                                
  138.                                                 nc=now.getPixel(xR,yR);
  139.                                                 //trace(nc.toString(16));
  140.                                                 nr=nc>>16&0xff;
  141.                                                 ng=nc>>8&0xff;
  142.                                                 nb=nc&0xff;
  143.                                                 nl=Math.sqrt(nr*nr + ng*ng + nb*nb);
  144.                                                 bc=before.getPixel(xR,yR);
  145.                                                 br=bc>>16&0xff;
  146.                                                 bg=bc>>8&0xff;
  147.                                                 bb=bc&0xff;
  148.                                                 bl=Math.sqrt(br*br + bg*bg + bb*bb);
  149.                                                 d=Math.round(Math.abs(bl-nl));
  150.                                                                
  151.                                                 if(d > tolerance)
  152.                                                 {
  153.                                                        
  154.                                                        
  155.                                                         if(bbo)
  156.                                                         {
  157.                                                                 if(fl_arr.length < 2000)
  158.                                                                 {
  159.                                                                         var te:Ctext = new Ctext();
  160.                                                                         te.x = xR;
  161.                                                                         te.y = yR;
  162.                                                                         addChild(te);
  163.                                                                         fl_arr.push(te);
  164.                                                                 }
  165.                                                         }       
  166.                                                        
  167.                                                        
  168.                                                        
  169.                                                        
  170.                                                        
  171.                                                 }
  172.                                                
  173.                                         }
  174.                                        
  175.                                        
  176.                                 }
  177.                                 evt.updateAfterEvent();
  178.                                 before = now.clone();
  179.                         }
  180.                         catch(e:TypeError)
  181.                         {
  182.                
  183.                
  184.                         }                      
  185.                 }       
  186.                 private function onMotionCapture(e:TimerEvent):void {
  187.                         trace("전 점의 갯수 : "+fl_arr.length);
  188.                         var len:int = fl_arr.length *2;
  189.                         for (var q:int = 0; q < fl_arr.length; q++) {
  190.                                 try{
  191.                                         removeChild(fl_arr.pop());
  192.                                 }
  193.                                 catch(e:Error)
  194.                                 {
  195.                                        
  196.                                 }
  197.                         }
  198.                         trace("후 점의 갯수 : "+fl_arr.length);
  199.  
  200.                 }
  201.                
  202.         }
  203. }

 이걸 비트맵이랑 연동하면 재미 있는게 나올꺼 같은데;; 아직 시도도 못해 보고 있는중;;;