2010年1月5日 星期二

AS3 Face Detection 練習

臉部辨識練習。

測試影片:
http://www.youtube.com/watch?v=EHocW-Bkqkc

線上DEMO:(需有 Webcam 視訊,正面對鏡頭)
http://www.asn.com.tw/flex/FaceDetector/FaceDetectorXML.html

參考網站:
http://www.squidder.com/2009/02/26/realtime-face-detection-in-flash/
這個網站以 OpenCV 為基礎,改寫成 flash 版本,效能不錯。

這邊還有一個網站有把它作些優化…
http://www.quasimondo.com/archives/000687.php
主要是 haarcascade 檔的載入把它轉成一個靜態的類別,但這樣變成只能作臉部辨識,haarcascade 就不能動態載入了。

*haarcascade 檔是拿來述描所要辨識的影像的特徵集。

squidder 載入的 haarcascade 檔是一個包含 Adler-32 Checksum 的 ZIP 壓縮檔,使用上比較不方便,我用了 nochump 的 ZIP LIB 寫了一個簡單的 ZipLoader.as 來給這個 DEMO 使用,好方便載入不同的 haarcascade 檔,使用時只要把 HaarCascadeLoader.as 原始檔中的 "import jp.maaash.net.ZipLoader" REMARK 掉即可(當然,你還要有 nochump 的 ZIP LIB)。

有試過安裝 OpenCV 並使用它的其它 haarcascade 檔,例如手部、眼睛…,可惜沒有辨識成功~"~,還需要再研究。



ZipLoader.as...
package
{
    import nochump.util.zip.*;
   
    import flash.events.EventDispatcher;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.utils.IDataInput;
    import flash.utils.ByteArray;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;

    public class ZipLoader extends EventDispatcher{
        private var debug:Boolean;
        private var _url:String;
        private var req:URLRequest;
        private var data:ByteArray;
       
        public function ZipLoader(d:Boolean=false){
            debug = d;
            req = new URLRequest;
        }

        public function load():void{
            var xmlLoader:URLLoader = new URLLoader();
            xmlLoader.addEventListener(Event.COMPLETE, onLoadXML);
            xmlLoader.dataFormat = URLLoaderDataFormat.BINARY;
            xmlLoader.load(req);
        }
       
        public function onLoadXML(e:Event):void
        {   
            var zipFile:ZipFile = new ZipFile(e.target.data);
            var entry:ZipEntry = zipFile.entries[0];
            //trace(entry.name);
            // extract the entry's data from the zip
            data = zipFile.getInput(entry);
            //trace(data.toString());

            dispatchEvent( e.clone() );
        }

        public function set url(u:String):void{
            _url = u;
            req.url = _url;
        }

        public function getContentAsString():String{
            return data.toString();
        }

        private function logger(... args):void{
            if(!debug){ return; }
            log(["[ZipLoader]"+args.shift()].concat(args));
        }
    }
}

1 則留言:

匿名 提到...
網誌管理員已經移除這則留言。

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...