程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Introduction to Face Detection and Face Recognition

Introduction to Face Detection and Face Recognition

編輯:C++入門知識

  一、簡介      在計算機視覺和生物識別領域,人臉識別是一個熱點。這項技術已經被研究了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).   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved