關(guān) 閉

新聞中心

EEPW首頁 > 安全與國防 > 設(shè)計應(yīng)用 > 基于OpenCV 的人臉檢測系統(tǒng)設(shè)計與實現(xiàn)

基于OpenCV 的人臉檢測系統(tǒng)設(shè)計與實現(xiàn)

作者: 時間:2012-10-15 來源:網(wǎng)絡(luò) 收藏

1.引言

  OpenCV(Intel·Open Source Computer Vision Library)是Intel 公司面向應(yīng)用程序開發(fā)者開發(fā)的計算機(jī)視覺庫,其中包含大量的函數(shù)用來處理計算機(jī)視覺領(lǐng)域中常見的問題,例如運(yùn)動分析和跟蹤、人臉識別、3D 重建和目標(biāo)識別等[1].可以通過訪問http://www.source- forge.net/projects/opencvlibrary 免費(fèi)獲得OpenCV 庫以及相關(guān)的資料。另外, 還可以通過訪問http://www.yahoogroups.com/group/OpenCV, 對于OpenCV使用中的一些問題與經(jīng)驗進(jìn)行討論。

  相對于其它圖像函數(shù)庫, OpenCV 是一種源碼開放式的函數(shù)庫, 開發(fā)者可以自由地調(diào)用函數(shù)庫中的相關(guān)處理函數(shù)。OpenCV 中包含300多個處理函數(shù)[1], 具備強(qiáng)大的圖像和矩陣運(yùn)算能力, 可以大大減少開發(fā)者的編程工作量, 有效提高開發(fā)效率和程序運(yùn)行的可靠性。另外, 由于OpenCV 具有很好的移植性, 開發(fā)者可以根據(jù)需要在MS-Windows 和Linux 兩種平臺進(jìn)行開發(fā)[2].

  人臉檢測(Face Detection)是指在輸入圖像中確定所有人臉(如果存在)的位置、大小、位姿的過程。人臉檢測作為人臉信息處理中的一項關(guān)鍵技術(shù), 近年來成為模式識別與計算機(jī)視覺領(lǐng)域內(nèi)一項受到普遍重視、研究十分活躍的課題。人臉檢測問題最初來源于人臉識別(FaceRecognition)。人臉識別的研究可以追溯到上個世紀(jì)六、七十年代, 經(jīng)過幾十年的曲折發(fā)展已日趨成熟。人臉檢測是自動人臉識別系統(tǒng)中的一個關(guān)鍵環(huán)節(jié), 但是早期的人臉識別研究主要針對具有較強(qiáng)約束條件的人臉圖像(如無背景的圖像), 往往假設(shè)人臉位置已知或很容易獲得, 因此人臉檢測問題并未受到重視。近幾年隨著電子商務(wù)等應(yīng)用的發(fā)展,人臉識別成為最有潛力的生物身份驗證手段, 這種應(yīng)用背景要求自動人臉識別系統(tǒng)能夠?qū)σ话阌纱怂媾R的一系列問題使得人臉檢測開始作為一個獨(dú)立的課題受到研究者的重視。今天, 人臉檢測的應(yīng)用背景已經(jīng)遠(yuǎn)遠(yuǎn)超出了人臉識別系統(tǒng)的范疇, 在基于內(nèi)容的檢索、數(shù)字視頻處理、視覺監(jiān)測等方面有著重要的應(yīng)用價值。

  人臉檢測研究具有重要的學(xué)術(shù)價值。人臉是一類具有相當(dāng)復(fù)雜的細(xì)節(jié)變化的自然結(jié)構(gòu)目標(biāo), 此類目標(biāo)的檢測問題的挑戰(zhàn)性在于: (1)人臉由于外貌、表情、膚色等不同, 具有模式的可變性; (2)一般可能存在眼鏡、胡須等附屬物; (3)作為三維物體的人臉的影像不可避免地受由光照產(chǎn)生的陰影的影響。因此, 如果能夠找到解決這些問題的方法, 成功構(gòu)造出人臉檢測與跟蹤系統(tǒng), 將為解決其它類似的復(fù)雜模式檢測問題提供重要的啟示。

  目前, 國外對人臉檢測問題的研究很多, 比較著名的有MIT, CMU等; 國內(nèi)的清華大學(xué)、北京工業(yè)大學(xué)、中科院計算所和自動化所等都有人員從事人臉檢測相關(guān)的研究。而且, MPEG7 標(biāo)準(zhǔn)組織已經(jīng)建立了人臉識別草案小組, 人臉檢測算法也是一項征集的內(nèi)容。隨著人臉檢測研究的深入, 國際上發(fā)表的有關(guān)論文數(shù)量也大幅度增長。

2.系統(tǒng)設(shè)計

  本文采用OpenCV 實現(xiàn)人臉檢測的原理是基于Adaboost 算法, 該算法是一種分類器算法, 其基本思想是利用大量的分類能力一般的簡單分類器(Basic classifier)通過一定的方法疊加(boost)起來, 構(gòu)成一個分類能力很強(qiáng)的強(qiáng)分類器(Stage classifier), 再將若干個強(qiáng)分類器串聯(lián)成為分級分類器(classifier cascade)完成圖像搜索檢測。串聯(lián)的級數(shù)依賴于系統(tǒng)對錯誤率和識別速度的要求。

  本系統(tǒng)由訓(xùn)練和檢測兩個模塊完成, 兩部分的流程圖如圖1 和圖2 所示:

圖1 訓(xùn)練程序流程圖

圖2 檢測程序流程圖

3.系統(tǒng)實現(xiàn)

  本系統(tǒng)采用Microsoft VC++編程工具實現(xiàn), 從OpenCV 官方網(wǎng)站上下載OpenCV 的最新版本后按照安裝說明安裝OpenCV 開發(fā)包, 并在VC++系統(tǒng)中配置好開發(fā)環(huán)境。系統(tǒng)中實現(xiàn)的主要檢測函數(shù)如下, 其中調(diào)用了OpenCV 函數(shù)庫中的部分函數(shù)。

  CRect CFaceDetect::DetectAndDrawFaces( IplImage* img )

  {

  CRect rc(0,0,0,0);

  if( m_pHidCascade img )

  {

  int scale = 2;

  CvSize img_size = cvGetSize( img );

  IplImage* temp = cvCreateImage ( cvSize (img_size.width/2,

  img_size.height/2), 8, 3 );

  int i;

  cvPyrDown( img, temp );

  cvClearMemStorage( m_pStorage );

  if( m_pHidCascade )

  {

  CvSeq* faces = cvHaarDetectObjects ( temp,

  m_pHidCascade, m_pStorage, 1.2, 2, 1 );

  for( i = 0; i (faces ? faces- >total : 0); i++ )

  {

  CvRect r = *(CvRect*)cvGetSeqElem( faces, i );

  cvRectangle( img,

  cvPoint(r.x*scale, r.y*scale),

  cvPoint ((r.x+r.width)*scale, (r.y+r.height)

  *scale),

  CV_RGB(255,0,0), 3 );

  rc.left = r.x*scale;

  rc.top = r.y*scale;

  rc.right = (r.x+r.width)*scale;

  rc.bottom = (r.y+r.height)*scale;

  }

  }

  cvReleaseImage( temp );

  }

  return rc;

  }

  其中函數(shù)cvHaarDetectObjects 使用針對某目標(biāo)物體訓(xùn)練的級聯(lián)分類器在圖像中找到包含目標(biāo)物體的矩形區(qū)域, 并且將這些區(qū)域作為一序列的矩形框返回。函數(shù)以不同比例大小的掃描窗口對圖像進(jìn)行幾次搜索。每次都要對圖像中的這些重疊區(qū)域利用cvRunHaarClassifierCascade進(jìn)行檢測。有時候也會利用某些繼承(heuristics)技術(shù)以減少分析的候選區(qū)域, 例如利用Canny 裁減(pruning)方法。函數(shù)在處理和收集到候選的方框(全部通過級聯(lián)分類器各層的區(qū)域) 科之后, 接著對這些區(qū)域進(jìn)行組合并且返回一系列各個足夠大的組合中的平均矩形。調(diào)節(jié)程序中的缺省參數(shù)(scale_factor=1.1, min_neighbors=3,flags=0)用于對目標(biāo)進(jìn)行更精確同時也是耗時較長的進(jìn)一步檢測。為了能對視頻圖像進(jìn)行更快的實時檢測, 參數(shù)設(shè)置通常是: scale_factor=1.2,min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING,min_size =minimumpossible face size.

4.結(jié)束語

  通過編程實現(xiàn)人臉檢測系統(tǒng)表明, 應(yīng)用OpenCV 函數(shù)庫進(jìn)行圖像處理編程, 功能強(qiáng)大, 簡捷高效, 可以使編程人員快速地實現(xiàn)算法。

  OpenCV 確實為VC++編程處理數(shù)字圖像提供了極大的方便, 具有廣闊的應(yīng)用前景。



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉