Changeset 17274 for lang/actionscript

Show
Ignore:
Timestamp:
08/08/08 23:38:39 (4 months ago)
Author:
gyuque
Message:

added an interface

Location:
lang/actionscript/ashaardetect/trunk/cv
Files:
1 added
4 modified

Legend:

Unmodified
Added
Removed
  • lang/actionscript/ashaardetect/trunk/cv/HaarCascade.as

    r17214 r17274  
    1717                private var mMaxWinWidth:uint = 1000000; 
    1818 
    19                 function HaarCascade() 
    20                 { 
    21  
     19                private var mSpecificityList:Array; 
     20 
     21                                function HaarCascade() 
     22                { 
     23 
     24                } 
     25 
     26                public function get specificityListStep():uint 
     27                { 
     28                        return 10; 
     29                } 
     30 
     31                public function get specificityList():Array 
     32                { 
     33                        return mSpecificityList; 
     34                } 
     35 
     36                public function initSpecificityList(n:uint):void 
     37                { 
     38                        mSpecificityList = new Array(n); 
     39                        for (var i:uint = 0;i < n;i++) 
     40                                mSpecificityList[i] = 1; 
    2241                } 
    2342 
     
    6786                private static const NPASS:uint = 2; 
    6887                private static const INVALID_MASK:uint = 0xffffff; 
    69                 public function detect(bmp:BitmapData, scale_factor:Number, min_width:int = 0, min_height:int = 0, limit:int = -1):Object 
     88                public function detect(bmp:BitmapData, entire_skip:Boolean, scale_factor:Number, min_width:int = 0, min_height:int = 0, limit:int = -1):Object 
    7089                { 
    7190                        if (!mYieldContext.enabled) { 
     
    97116                        var mask_index:uint = mYieldContext.mask_index; 
    98117                        var hueval:Number; 
     118 
     119                        var skip:Boolean = false; 
    99120 
    100121                        if (scale_factor == 0) 
     
    115136                                        continue; 
    116137 
     138                                if (mSpecificityList) 
     139                                { 
     140                                        if ( mSpecificityList[int(winWidth/10)] == 0 ) 
     141                                        { 
     142                                                if (entire_skip) continue; 
     143                                                skip = true; 
     144                                        } 
     145                                        else 
     146                                                skip = false; 
     147                                } 
     148 
    117149                                var stop_height:uint = (srcHeight - winHeight) / ystep; 
    118150                                var result:int; 
     
    124156                                        for(var _iy:uint = mYieldContext._iy; _iy < stop_height; _iy++) 
    125157                                        { 
     158                                                if (skip && (_iy & 1) != 0) 
     159                                                { 
     160                                                        mYieldContext._iy = 0; 
     161                                                        continue; 
     162                                                } 
     163 
     164 
    126165                                                if (--limit == 0) 
    127166                                                        { saveContext(_iy,  pass,  resrects1,  factor,  mask_index,  sums); return YIELDED; } 
     
    161200                                                                } 
    162201                                                                else if( result < 0 ) { 
    163                                                                         _xstep = 1; 
     202                                                                        if (!skip) 
     203                                                                                _xstep = 1; 
    164204                                                                } 
    165205 
  • lang/actionscript/ashaardetect/trunk/cv/HaarCascade.mas

    r17214 r17274  
    1919                private var mMaxWinWidth:uint = 1000000; 
    2020 
     21                private var mSpecificityList:Array; 
     22 
     23                #define SPL_STEP 10 
     24 
    2125                function HaarCascade() 
    2226                { 
    2327 
     28                } 
     29 
     30                public function get specificityListStep():uint 
     31                { 
     32                        return SPL_STEP; 
     33                } 
     34 
     35                public function get specificityList():Array 
     36                { 
     37                        return mSpecificityList; 
     38                } 
     39 
     40                public function initSpecificityList(n:uint):void 
     41                { 
     42                        mSpecificityList = new Array(n); 
     43                        for (var i:uint = 0;i < n;i++) 
     44                                mSpecificityList[i] = 1; 
    2445                } 
    2546 
     
    7394                private static const NPASS:uint = 2; 
    7495                private static const INVALID_MASK:uint = 0xffffff; 
    75                 public function detect(bmp:BitmapData, scale_factor:Number, min_width:int = 0, min_height:int = 0, limit:int = -1):Object 
     96                public function detect(bmp:BitmapData, entire_skip:Boolean, scale_factor:Number, min_width:int = 0, min_height:int = 0, limit:int = -1):Object 
    7697                { 
    7798                        if (!mYieldContext.enabled) { 
     
    103124                        var mask_index:uint = mYieldContext.mask_index; 
    104125                        var hueval:Number; 
     126 
     127                        var skip:Boolean = false; 
    105128 
    106129                        if (scale_factor == 0) 
     
    121144                                        continue; 
    122145 
     146                                if (mSpecificityList) 
     147                                { 
     148                                        if ( mSpecificityList[int(winWidth/SPL_STEP)] == 0 ) 
     149                                        { 
     150                                                if (entire_skip) continue; 
     151                                                skip = true; 
     152                                        } 
     153                                        else 
     154                                                skip = false; 
     155                                } 
     156 
    123157                                var stop_height:uint = (srcHeight - winHeight) / ystep; 
    124158                                var result:int; 
     
    130164                                        for(var _iy:uint = mYieldContext._iy; _iy < stop_height; _iy++) 
    131165                                        { 
     166                                                if (skip && (_iy & 1) != 0) 
     167                                                { 
     168                                                        mYieldContext._iy = 0; 
     169                                                        continue; 
     170                                                } 
     171 
     172 
    132173                                                if (--limit == 0) 
    133174                                                        YIELD(_iy, pass, resrects1, factor, mask_index, sums) 
     
    167208                                                                } 
    168209                                                                else if( result < 0 ) { 
    169                                                                         _xstep = 1; 
     210                                                                        if (!skip) 
     211                                                                                _xstep = 1; 
    170212                                                                } 
    171213 
  • lang/actionscript/ashaardetect/trunk/cv/RectPool.as

    r17214 r17274  
    4242                } 
    4343 
     44                public function mapRect(f:Function):void 
     45                { 
     46                        for each(var rd:RectData in mPool) 
     47                        { 
     48                                if (rd.ttl >= 1) 
     49                                        f(rd.showPos, rd.alpha); 
     50                        } 
     51                } 
     52 
    4453                private static function filt_func(item:*, index:int, array:Array):Boolean 
    4554                { 
     
    7281                                rc2[3] += rc2[1]; 
    7382                                for (k = 0;k < 4;k++) 
    74                                         rc2[k] += (rc1[k] - rc2[k]) * 0.4; 
     83                                        rc2[k] += (rc1[k] - rc2[k]) * 0.7; 
    7584                                rc1[2] -= rc1[0]; 
    7685                                rc1[3] -= rc1[1]; 
  • lang/actionscript/ashaardetect/trunk/cv/VideoDetector.as

    r17214 r17274  
    66        import flash.events.*; 
    77        import flash.geom.*; 
    8         public class VideoDetector extends Sprite 
     8        public class VideoDetector extends Sprite implements IStreamingControl 
    99        { 
    1010                private static const OFFSCR_WIDTH:uint  = 320; 
     
    2121                private var mClearTmpBuf:Boolean; 
    2222                private var mGenHue:Boolean; 
     23                private var mTickHandler:Function = null; 
    2324 
    2425                private var mRectPool:RectPool = new RectPool(); 
     26                private var mSpList:Array; 
     27                private var mSpListChanged:Boolean; 
     28 
     29                private var mPlaying:Boolean = true; 
     30                private var mPauseBitmapData:BitmapData; 
     31                private var mPauseBitmap:Bitmap = new Bitmap(); 
     32                private var mLastRect:Array = null; 
     33 
     34                private var mOffscreenRect:Rectangle = new Rectangle(); 
     35                private var mOriginPt:Point = new Point(0, 0); 
     36                private var mSkipEntire:Boolean = false; 
    2537 
    2638                function VideoDetector(v:Video, dat:ByteArray) 
    2739                { 
     40                        mouseChildren = false; 
    2841                        mVideo = v; 
    2942                        mDetector = HaarCascade.fromBin(dat); 
    30                         mDetector.maxWinWidth = 130; 
     43                        mDetector.maxWinWidth = 190; 
     44                        mDetector.initSpecificityList(24); 
     45                        mouseEnabled = false; 
     46                        addChild(v); 
     47                        addChild(mPauseBitmap); 
     48                } 
     49 
     50                public function playStream():void { 
     51                        mPauseBitmap.bitmapData = null; 
     52                        mPlaying = true; 
     53                } 
     54 
     55                public function pauseStream():void { 
     56                        mPauseBitmap.bitmapData = mOffscreen; 
     57                        mSkipEntire = false; 
     58                        mPlaying = false; 
     59                } 
     60 
     61                public function get playing():Boolean { 
     62                        return mPlaying; 
     63                } 
     64 
     65                public function get lastImage():BitmapData { 
     66                        return mPauseBitmapData; 
     67                } 
     68 
     69                public function get lastRect():Array { 
     70                        return mLastRect; 
     71                } 
     72 
     73                public function set onTick(f:Function):void 
     74                { 
     75                        mTickHandler = f; 
    3176                } 
    3277 
     
    5196                                mHueData   = new BitmapData(OFFSCR_WIDTH, OFFSCR_HEIGHT, false); 
    5297                                mOffscreen = new BitmapData(OFFSCR_WIDTH, OFFSCR_HEIGHT, false); 
     98                                mPauseBitmapData = new BitmapData(OFFSCR_WIDTH, OFFSCR_HEIGHT, false); 
    5399                                mWRatio = Number(OFFSCR_WIDTH ) / Number(mVideo.width); 
    54100                                mHRatio = Number(OFFSCR_HEIGHT) / Number(mVideo.height); 
     101                                mOffscreenRect.x = mOffscreenRect.y = 0; 
     102                                mOffscreenRect.width  = OFFSCR_WIDTH; 
     103                                mOffscreenRect.height = OFFSCR_HEIGHT; 
    55104                                mCopyMat = new Matrix(); 
    56105                                mCopyMat.scale(mWRatio, mHRatio); 
    57106                        } 
    58107 
     108                        var res:Object; 
    59109                        var detector_limit:uint = 200; 
    60                         if (mClearTmpBuf) 
     110 
     111 
     112                        if (mClearTmpBuf && mPlaying) 
    61113                        { 
     114                                mSkipEntire = !mSkipEntire; 
    62115                                detector_limit = 10; 
     116                                mPauseBitmapData.copyPixels(mOffscreen, mOffscreenRect, mOriginPt); 
    63117                                mOffscreen.draw(mVideo, mCopyMat); 
    64118                                U.makeGrayscale(mTmpData, mOffscreen) 
     
    68122                        } 
    69123                        else if (mGenHue) { 
    70                                 detector_limit = 200; 
     124                                detector_limit = 130; 
    71125                                U.makeHueImage(mHueData, mOffscreen); 
    72126                                mDetector.generateHueSum(mHueData); 
     
    74128                        } 
    75129 
    76                         var res:Object = mDetector.detect(mTmpData, 1.2, 44, 44, detector_limit); 
     130                        if (!mPlaying) 
     131                                detector_limit = 10; 
     132         
     133                        res = mDetector.detect(mTmpData, mSkipEntire, 1.2, 44, 44, detector_limit); 
     134 
    77135                        var rc:Array; 
    78136                        if (res !== HaarCascade.YIELDED) 
    79137                        { 
    80                                 STDOUT.cls(); 
     138                                mLastRect = null; 
     139                                // STDOUT.cls(); 
    81140                                if (res) { 
    82                                         STDOUT.puts(res.length + " windows passed"); 
    83  
     141                                //      STDOUT.puts(res.length + " windows passed"); 
     142/* 
    84143                                        g.lineStyle(3, 0, 0.1); 
    85144                                        for each(rc in res) 
     
    89148                                        for each(rc in res) 
    90149                                                g.drawRect(rc[0], rc[1], rc[2], rc[3]); 
    91  
     150*/ 
    92151                                        var clss:Array = U.bindNeighborRects(res as Array); 
    93152                                        if (clss) { 
    94153                                                res = U.uniteRects(res as Array, clss, 2); 
    95                                                 mRectPool.update(res as Array); 
     154                                                if (res) 
     155                                                { 
     156                                                        mLastRect = res[0]; 
     157                                                        mRectPool.update(res as Array); 
     158                                                } 
    96159                                        } 
    97160                                } 
    98161                                else { 
    99162                                        mRectPool.update([]); 
    100                                         graphics.clear(); 
    101                                         STDOUT.puts("None"); 
     163                                //      graphics.clear(); 
     164                                //      STDOUT.puts("None"); 
    102165                                } 
    103166 
     
    106169 
    107170                        mRectPool.tick(); 
    108                         mRectPool.draw(g, 0xff0044); 
     171//                      mRectPool.draw(g, 0xff0044); 
     172                        if (null != mTickHandler) 
     173                                mTickHandler(mRectPool); 
     174 
     175                        mSpList = mDetector.specificityList; 
     176                        mSpListChanged = false; 
     177                        clearSpList(0); 
     178                        mRectPool.mapRect(updateSpList); 
     179 
     180                        if (mSpListChanged) 
     181                                expandSpList(); 
     182                        else 
     183                                clearSpList(1); 
     184 
     185//                      STDOUT.cls(); 
     186//                      STDOUT.puts(mSpList.join(" ")); 
     187                } 
     188 
     189                private function clearSpList(k:int):void 
     190                { 
     191                        var len:int = mSpList.length; 
     192                        for (var i:int = 0;i < len;i++) 
     193                                mSpList[i] = k; 
     194                } 
     195 
     196                private function expandSpList():void 
     197                { 
     198                        var len:int = mSpList.length - 1; 
     199                        for (var i:int = 1;i < len;i++) 
     200                        { 
     201                                if (mSpList[i] == 0) 
     202                                { 
     203                                        if (mSpList[i-1] == 2 || mSpList[i+1] == 2) 
     204                                                mSpList[i] = 1; 
     205                                } 
     206                        } 
     207                } 
     208 
     209                private function updateSpList(rc:Array, a:Number):void 
     210                { 
     211                        var i:uint = uint(rc[2] / mDetector.specificityListStep); 
     212                        mSpList[i] = 2; 
     213                        mSpListChanged = true; 
    109214                } 
    110215        }