一、簡介 在計算機視覺和生物識別領域,人臉識別是一個熱點。這項技術已經被研究了25年,現在廣泛應用在安全、機器人、人機交互、數碼相機、游戲盒和娛樂。 人臉識別通常包括兩個階段 1.人臉檢測 首先通過搜索圖片找到人臉區域,然後通過對這些區域的處理可以更容易的進行識別。 2. 人臉識別 通過檢索數據庫的人臉,來進行匹配確定具體的人 自從2002年以來,人臉檢測已經具有較為可靠的識別特性,比如利用OpenCv的人臉檢測庫,對清晰正面臉的識別精確度可達到90%-95%。通常來說,對於有一定遮擋和有角度的人臉檢測是比較苦難的。在這種情況下,需要3D頭部姿態估計來輔助識別。當然,對於品質不好的圖像、人臉分辨率不一致、有遮擋和戴眼鏡的圖像來說,人臉檢測同樣是比較困難的。 相比人臉檢測二樣,人臉識別具有較小的准確率,一般在30%到70%之間。自從九十年代以來,人臉識別一直是一個重要的研究領域,不過目前還遠沒有達到可靠地要求,每年都要大量的技術別發明例如本頁的最上面的技術((Alternatives to Eigenfaces such as 3D face recognition or recognition from video)) 接下來,我將介紹如何利用 Eigenfaces(或者叫做“主成分分析”orPCA),相比於一些常用的方法(神經網路、Fishetr Face)來說,這種方法是一種簡單和常用的二位人臉識別。 你可以通過閱讀Face Recognition With Eigenface (這篇文章可以在 Servo Magazine (April 2007), 或者mathematical algorithm.中找到)來學習Eigenfaces的理論。 首先我將先介紹如何通過命令行進行人臉識別,更多詳細的參見Servo Magazine tutorial and source-code (May 2007). 在介紹完如何通過命令行進行人臉識別後,我將介紹如何拓展到到實時的檢測中。 二、如何利用OpenCV的人臉識別庫來進行人臉檢測 正如前面介紹的,人臉識別的第一步是人臉檢測。在OpenCv中,利用級聯(also known as the Viola-Jones method)的人臉檢測可以很容易的在一張圖片中檢測一個全臉。 在OpenCV中,級聯檢測是一個有效的人臉檢測方法,但是如果直接用這個功能還是有些煩人的,因此我們這裡用最簡單的方法,既使用包裝好的函數。 [cpp] // Perform face detection on the input image, using the given Haar Cascade. // Returns a rectangle for the detected region in the given image. CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade) { // Smallest face size. CvSize minFeatureSize = cvSize(20, 20); // Only search for 1 face. int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH; // How detailed should the search be. float search_scale_factor = 1.1f; IplImage *detectImg; IplImage *greyImg = 0; CvMemStorage* storage; CvRect rc; double t; CvSeq* rects; CvSize size; int i, ms, nFaces; storage = cvCreateMemStorage(0); cvClearMemStorage( storage ); // If the image is color, use a greyscale copy of the image. detectImg = (IplImage*)inputImg; if (inputImg->nChannels > 1) { size = cvSize(inputImg->width, inputImg->height); greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1 ); cvCvtColor( inputImg, greyImg, CV_BGR2GRAY ); detectImg = greyImg; // Use the greyscale image. } // Detect all the faces in the greyscale image. t = (double)cvGetTickCount(); rects = cvHaarDetectObjects( detectImg, cascade, storage, search_scale_factor, 3, flags, minFeatureSize); t = (double)cvGetTickCount() - t; ms = cvRound( t / ((double)cvGetTickFrequency() * 1000.0) ); nFaces = rects->total; printf("Face Detection took %d ms and found %d objects\n", ms, nFaces); // Get the first detected face (the biggest). if (nFaces > 0) www.2cto.com rc = *(CvRect*)cvGetSeqElem( rects, 0 ); else rc = cvRect(-1,-1,-1,-1); // Couldn't find the face. if (greyImg) cvReleaseImage( &greyImg ); cvReleaseMemStorage( &storage ); //cvReleaseHaarClassifierCascade( &cascade ); return rc; // Return the biggest face found, or (-1,-1,-1,-1). }