2010年1月12日 星期二

PHP中計算某一周的起始及結束日期

以星期日為一周起始,函式傳入年份及第幾周,函式傳出開始及結束日期。


function findWeekPeriod( $week, $year )
{
    $aPeriod = array();
    $first_day = strtotime($year."-01-01");
    $is_week_first_day = date("w", $first_day) == 0;
    $is_weekone = strftime("%V", $first_day) == 1;
    if($is_weekone)
    {
        $week_one_start = $is_week_first_day ? strtotime("last sunday",$first_day) : $first_day;
    }
    else
    {
        $week_one_start = strtotime("next sunday", $first_day);
    }
    $aPeriod['start'] =  date("Y年m月d日", $week_one_start+(3600*24*7*($week-1)) );
    $aPeriod['end'] =  date("Y年m月d日", $week_one_start+(3600*24*(7*$week-1)) );
    return $aPeriod;      
}

例如…
      $week=date('W');
      $year=date('Y');
      $wPeriod=findWeekPeriod( $week, $year );
      /// 傳回當周的起始結束日期。

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));
        }
    }
}

更高效處理 micro second 的方式

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