基于OpenCV 的人臉檢測系統設計與實(shí)現
1.引言
OpenCV(Intel·Open Source Computer Vision Library)是Intel 公司面向應用程序開(kāi)發(fā)者開(kāi)發(fā)的計算機視覺(jué)庫,其中包含大量的函數用來(lái)處理計算機視覺(jué)領(lǐng)域中常見(jiàn)的問(wèn)題,例如運動(dòng)分析和跟蹤、人臉識別、3D 重建和目標識別等[1].可以通過(guò)訪(fǎng)問(wèn)http://www.source- forge.net/projects/opencvlibrary 免費獲得OpenCV 庫以及相關(guān)的資料。另外, 還可以通過(guò)訪(fǎng)問(wèn)http://www.yahoogroups.com/group/OpenCV, 對于OpenCV使用中的一些問(wèn)題與經(jīng)驗進(jìn)行討論。
相對于其它圖像函數庫, OpenCV 是一種源碼開(kāi)放式的函數庫, 開(kāi)發(fā)者可以自由地調用函數庫中的相關(guān)處理函數。OpenCV 中包含300多個(gè)處理函數[1], 具備強大的圖像和矩陣運算能力, 可以大大減少開(kāi)發(fā)者的編程工作量, 有效提高開(kāi)發(fā)效率和程序運行的可靠性。另外, 由于OpenCV 具有很好的移植性, 開(kāi)發(fā)者可以根據需要在MS-Windows 和Linux 兩種平臺進(jìn)行開(kāi)發(fā)[2].
人臉檢測(Face Detection)是指在輸入圖像中確定所有人臉(如果存在)的位置、大小、位姿的過(guò)程。人臉檢測作為人臉信息處理中的一項關(guān)鍵技術(shù), 近年來(lái)成為模式識別與計算機視覺(jué)領(lǐng)域內一項受到普遍重視、研究十分活躍的課題。人臉檢測問(wèn)題最初來(lái)源于人臉識別(FaceRecognition)。人臉識別的研究可以追溯到上個(gè)世紀六、七十年代, 經(jīng)過(guò)幾十年的曲折發(fā)展已日趨成熟。人臉檢測是自動(dòng)人臉識別系統中的一個(gè)關(guān)鍵環(huán)節, 但是早期的人臉識別研究主要針對具有較強約束條件的人臉圖像(如無(wú)背景的圖像), 往往假設人臉位置已知或很容易獲得, 因此人臉檢測問(wèn)題并未受到重視。近幾年隨著(zhù)電子商務(wù)等應用的發(fā)展,人臉識別成為最有潛力的生物身份驗證手段, 這種應用背景要求自動(dòng)人臉識別系統能夠對一般由此所面臨的一系列問(wèn)題使得人臉檢測開(kāi)始作為一個(gè)獨立的課題受到研究者的重視。今天, 人臉檢測的應用背景已經(jīng)遠遠超出了人臉識別系統的范疇, 在基于內容的檢索、數字視頻處理、視覺(jué)監測等方面有著(zhù)重要的應用價(jià)值。
人臉檢測研究具有重要的學(xué)術(shù)價(jià)值。人臉是一類(lèi)具有相當復雜的細節變化的自然結構目標, 此類(lèi)目標的檢測問(wèn)題的挑戰性在于: (1)人臉由于外貌、表情、膚色等不同, 具有模式的可變性; (2)一般可能存在眼鏡、胡須等附屬物; (3)作為三維物體的人臉的影像不可避免地受由光照產(chǎn)生的陰影的影響。因此, 如果能夠找到解決這些問(wèn)題的方法, 成功構造出人臉檢測與跟蹤系統, 將為解決其它類(lèi)似的復雜模式檢測問(wèn)題提供重要的啟示。
目前, 國外對人臉檢測問(wèn)題的研究很多, 比較著(zhù)名的有MIT, CMU等; 國內的清華大學(xué)、北京工業(yè)大學(xué)、中科院計算所和自動(dòng)化所等都有人員從事人臉檢測相關(guān)的研究。而且, MPEG7 標準組織已經(jīng)建立了人臉識別草案小組, 人臉檢測算法也是一項征集的內容。隨著(zhù)人臉檢測研究的深入, 國際上發(fā)表的有關(guān)論文數量也大幅度增長(cháng)。
2.系統設計
本文采用OpenCV 實(shí)現人臉檢測的原理是基于A(yíng)daboost 算法, 該算法是一種分類(lèi)器算法, 其基本思想是利用大量的分類(lèi)能力一般的簡(jiǎn)單分類(lèi)器(Basic classifier)通過(guò)一定的方法疊加(boost)起來(lái), 構成一個(gè)分類(lèi)能力很強的強分類(lèi)器(Stage classifier), 再將若干個(gè)強分類(lèi)器串聯(lián)成為分級分類(lèi)器(classifier cascade)完成圖像搜索檢測。串聯(lián)的級數依賴(lài)于系統對錯誤率和識別速度的要求。
本系統由訓練和檢測兩個(gè)模塊完成, 兩部分的流程圖如圖1 和圖2 所示:
圖1 訓練程序流程圖
圖2 檢測程序流程圖
3.系統實(shí)現
本系統采用Microsoft VC++編程工具實(shí)現, 從OpenCV 官方網(wǎng)站上下載OpenCV 的最新版本后按照安裝說(shuō)明安裝OpenCV 開(kāi)發(fā)包, 并在VC++系統中配置好開(kāi)發(fā)環(huán)境。系統中實(shí)現的主要檢測函數如下, 其中調用了OpenCV 函數庫中的部分函數。
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;
}
其中函數cvHaarDetectObjects 使用針對某目標物體訓練的級聯(lián)分類(lèi)器在圖像中找到包含目標物體的矩形區域, 并且將這些區域作為一序列的矩形框返回。函數以不同比例大小的掃描窗口對圖像進(jìn)行幾次搜索。每次都要對圖像中的這些重疊區域利用cvRunHaarClassifierCascade進(jìn)行檢測。有時(shí)候也會(huì )利用某些繼承(heuristics)技術(shù)以減少分析的候選區域, 例如利用Canny 裁減(pruning)方法。函數在處理和收集到候選的方框(全部通過(guò)級聯(lián)分類(lèi)器各層的區域) 科之后, 接著(zhù)對這些區域進(jìn)行組合并且返回一系列各個(gè)足夠大的組合中的平均矩形。調節程序中的缺省參數(scale_factor=1.1, min_neighbors=3,flags=0)用于對目標進(jìn)行更精確同時(shí)也是耗時(shí)較長(cháng)的進(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.結束語(yǔ)
通過(guò)編程實(shí)現人臉檢測系統表明, 應用OpenCV 函數庫進(jìn)行圖像處理編程, 功能強大, 簡(jiǎn)捷高效, 可以使編程人員快速地實(shí)現算法。
OpenCV 確實(shí)為VC++編程處理數字圖像提供了極大的方便, 具有廣闊的應用前景。
評論