OpenCV人臉識別--detectMultiScale函數

轉載請註明出處:http://blog.csdn.net/itismelzp/article/details/50379359html

 

 

 

首先上兩張圖。函數

 

 

 

如今要對上面兩張圖進行人臉識別。spa

 

 

 

 

1、Haar特徵分類器介紹

 

 

Haar特徵分類器就是一個XML文件,該文件中會描述人體各個部位的Haar特徵值。包括人臉、眼睛、嘴脣等等。.net

Haar特徵分類器存放目錄:opencv安裝目錄中的\data\ haarcascades目錄下,opencv2.4.8版本下的Haar特徵分類器以下:xml

 

[html]  view plain  copy
 
  1. haarcascade_eye.xml  
  2. haarcascade_eye_tree_eyeglasses.xml  
  3. haarcascade_frontalface_alt.xml  
  4. haarcascade_frontalface_alt_tree.xml  
  5. haarcascade_frontalface_alt2.xml  
  6. haarcascade_frontalface_default.xml  
  7. haarcascade_fullbody.xml  
  8. haarcascade_lefteye_2splits.xml  
  9. haarcascade_lowerbody.xml  
  10. haarcascade_mcs_eyepair_big.xml  
  11. haarcascade_mcs_eyepair_small.xml  
  12. haarcascade_mcs_leftear.xml  
  13. haarcascade_mcs_lefteye.xml  
  14. haarcascade_mcs_mouth.xml  
  15. haarcascade_mcs_nose.xml  
  16. haarcascade_mcs_rightear.xml  
  17. haarcascade_mcs_righteye.xml  
  18. haarcascade_mcs_upperbody.xml  
  19. haarcascade_profileface.xml  
  20. haarcascade_righteye_2splits.xml  
  21. haarcascade_smile.xml  
  22. haarcascade_upperbody.xml  


根據命名就能夠很快知道各個分類器的用途。htm

 

 

其中:haarcascade_frontalface_alt.xml與haarcascade_frontalface_alt2.xml都是人臉識別的Haar特徵分類器了。對象

 

 

 

2、detectMultiScale函數詳解

 

 

cvHaarDetectObjects是opencv1中的函數,opencv2中人臉檢測使用的是 detectMultiScale函數。它能夠檢測出圖片中全部的人臉,並將人臉用vector保存各我的臉的座標、大小(用矩形表示),函數由分類器對象調用:blog

 

 

[cpp]  view plain  copy
 
  1. void detectMultiScale(  
  2.     const Mat& image,  
  3.     CV_OUT vector<Rect>& objects,  
  4.     double scaleFactor = 1.1,  
  5.     int minNeighbors = 3,   
  6.     int flags = 0,  
  7.     Size minSize = Size(),  
  8.     Size maxSize = Size()  
  9. );  



 

函數介紹:圖片

參數1:image--待檢測圖片,通常爲灰度圖像加快檢測速度;ip

參數2:objects--被檢測物體的矩形框向量組;
參數3:scaleFactor--表示在先後兩次相繼的掃描中,搜索窗口的比例係數。默認爲1.1即每次搜索窗口依次擴大10%;
參數4:minNeighbors--表示構成檢測目標的相鄰矩形的最小個數(默認爲3個)。
        若是組成檢測目標的小矩形的個數和小於 min_neighbors - 1 都會被排除。
        若是min_neighbors 爲 0, 則函數不作任何操做就返回全部的被檢候選矩形框,
        這種設定值通常用在用戶自定義對檢測結果的組合程序上;
參數5:flags--要麼使用默認值,要麼使用CV_HAAR_DO_CANNY_PRUNING,若是設置爲

        CV_HAAR_DO_CANNY_PRUNING,那麼函數將會使用Canny邊緣檢測來排除邊緣過多或過少的區域,

        所以這些區域一般不會是人臉所在區域;
參數六、7:minSize和maxSize用來限制獲得的目標區域的範圍。

 

 

 

 

 

 

3、示例代碼

 

 

 

[cpp]  view plain  copy
 
  1. #include <opencv2/core/core.hpp>  
  2. #include <opencv2/imgproc/imgproc.hpp>  
  3. #include <opencv2/opencv.hpp>  
  4.   
  5. #include <vector>  
  6. #include <cstdio>  
  7.   
  8. using namespace std;  
  9. using namespace cv;  
  10.   
  11. int main()  
  12. {  
  13.       
  14.     // 【1】加載分類器  
  15.     CascadeClassifier cascade;  
  16.     cascade.load("haarcascade_frontalface_alt2.xml");  
  17.   
  18.     Mat srcImage, grayImage,dstImage;  
  19.     // 【2】讀取圖片  
  20.     srcImage = imread("image.jpg");  
  21.     dstImage = srcImage.clone();  
  22.     imshow("【原圖】", srcImage);  
  23.   
  24.     grayImage.create(srcImage.size(), srcImage.type());  
  25.     cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度圖,提升檢測效率  
  26.   
  27.     // 定義7種顏色,用於標記人臉  
  28.     Scalar colors[] =  
  29.     {  
  30.         // 紅橙黃綠青藍紫  
  31.         CV_RGB(255, 0, 0),  
  32.         CV_RGB(255, 97, 0),  
  33.         CV_RGB(255, 255, 0),  
  34.         CV_RGB(0, 255, 0),  
  35.         CV_RGB(0, 255, 255),  
  36.         CV_RGB(0, 0, 255),  
  37.         CV_RGB(160, 32, 240)  
  38.     };  
  39.   
  40.     // 【3】檢測  
  41.     vector<Rect> rect;  
  42.     cascade.detectMultiScale(grayImage, rect, 1.1, 3, 0);  // 分類器對象調用  
  43.   
  44.     printf("檢測到人臉個數:%d\n", rect.size());  
  45.   
  46.     // 【4】標記--在臉部畫圓  
  47.     for (int i = 0; i < rect.size();i++)  
  48.     {  
  49.         Point  center;  
  50.         int radius;  
  51.         center.x = cvRound((rect[i].x + rect[i].width * 0.5));  
  52.         center.y = cvRound((rect[i].y + rect[i].height * 0.5));  
  53.   
  54.         radius = cvRound((rect[i].width + rect[i].height) * 0.25);  
  55.         circle(dstImage, center, radius, colors[i % 7], 2);  
  56.     }  
  57.   
  58.     // 【5】顯示  
  59.     imshow("【人臉識別detectMultiScale】", dstImage);  
  60.       
  61.     waitKey(0);  
  62.     return 0;  
  63. }  



 

 

 

效果圖:

 

 

 

若是要識別人體的其它部位,只需將上面的haarcascade_frontalface_alt2.xml分類器替換便可。

 

源碼+圖片下載:http://download.csdn.net/detail/itismelzp/9385247

相關文章
相關標籤/搜索