資源描述:
《基于Haar特征的人臉檢測課件.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、2013/3/25數(shù)據(jù)挖掘之基于Haar特征提取的人臉檢測主要內(nèi)容相關(guān)概念介紹人臉檢測的步驟核心代碼人臉檢測前后對照圖效果演示相關(guān)概念介紹AdaBoost人臉檢測訓(xùn)練算法速度很重要的兩方面是特征選取和特征計算。選取的特征為矩特征-Haar特征,計算的方法為積分圖。下面就簡要介紹Haar特征以及積分圖的相關(guān)概念。Haar特征Haar特征分為三類:邊緣特征、線性特征、中心特征和對角線特征,組合成特征模板。特征模板內(nèi)有白色和黑色兩種矩形,并定義該模板的特征值為白色矩形像素和減去黑色矩形像素和。在確定了特征形式后Harr-like特征的數(shù)量就取
2、決于訓(xùn)練樣本圖像矩陣的大小,特征模板在子窗口內(nèi)任意放置,一種形態(tài)稱為一種特征,找出所有子窗口的特征是進(jìn)行弱分類訓(xùn)練的基礎(chǔ)。積分圖積分圖(IntegralImage)主要的思想是將圖像從起點開始到各個點所形成的矩形區(qū)域像素之和作為一個數(shù)組的元素保存在內(nèi)存中,當(dāng)要計算某個區(qū)域的像素和時可以直接索引數(shù)組的元素,不用重新計算這個區(qū)域的像素和,從而加快了計算。“積分圖"能夠在多種尺度下,使用相同的時間來計算不同的特征,因此大大提高了檢測速度。人臉檢測的目的就是從圖片中找出所有包含人臉的子窗口,將人臉的子窗口與非人臉的子窗口分開。大致步驟如下:(1
3、)在一個20*20的圖片提取一些簡單的特征(稱為Harr特征),如下圖所示。人臉檢測的步驟它的計算方法就是將白色區(qū)域內(nèi)的像素和減去黑色區(qū)域,因此在人臉與非人臉圖片的相同位置上,值的大小是不一樣的,這些特征可以用來區(qū)分人臉和非人臉。(2)目前的方法是使用數(shù)千張切割好的人臉圖片,和上萬張背景圖片作為訓(xùn)練樣本。訓(xùn)練圖片一般歸一化到20*20的大小。在這樣大小的圖片中,可供使用的haar特征數(shù)在1萬個左右,然后通過機(jī)器學(xué)習(xí)算法—adaboost算法挑選數(shù)千個有效的haar特征來組成人臉檢測器。(3)學(xué)習(xí)算法訓(xùn)練出一個人臉檢測器后,便可以在各個場
4、合使用了。使用時,將圖像按比例依次縮放,然后在縮放后的圖片的20*20的子窗口依次判別是人臉還是非人臉。人臉檢測的流程人臉檢測在實際中主要用于人臉識別的預(yù)處理,即在圖像中準(zhǔn)確標(biāo)定出人臉的位置和大小。目前人臉檢測技術(shù)在門禁系統(tǒng)、智能監(jiān)控系統(tǒng)中已得到了很好的應(yīng)用。另外,目前的筆記本電腦中也陸續(xù)開始使用人臉識別技術(shù)作為計算機(jī)登錄的憑證。近年來,在數(shù)碼相機(jī)和手機(jī)中也集成了人臉檢測算法,作為一個新的功能提供用戶使用。在這些應(yīng)用中,人臉檢測都是發(fā)揮著至關(guān)重要的作用核心代碼voiddetect_and_draw(IplImage*img){stati
5、cCvScalarcolors[]={{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}};doublescale=1.3;IplImage*gray=cvCreateImage(cvSize(img->width,img->height),8,1);IplImage*small_img=cvCreateImage(cvSize(cvRound(img->width/scale)
6、,cvRound(img->height/scale)),8,1);inti;cvCvtColor(img,gray,CV_BGR2GRAY);cvResize(gray,small_img,CV_INTER_LINEAR);cvEqualizeHist(small_img,small_img);cvClearMemStorage(storage);if(cascade){doublet=(double)cvGetTickCount();CvSeq*faces=cvHaarDetectObjects(small_img,cascade,
7、storage,1.1,2,0/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(30,30));t=(double)cvGetTickCount()-t;printf("detcetiontime=%gms",t/((double)cvGetTickFrequency()*1000.));for(i=0;i<(faces?faces->total:0);i++){CvRect*r=(CvRect*)cvGetSeqElem(faces,i);CvPointcenter;intradius;center.x=cv
8、Round((r->x+r->width*0.5)*scale);center.y=cvRound((r->y+r->height*0.5)*scale);radius=cvRound((r->width+