OpenCV人臉識別--detectMultiScale函數


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

 

 

 

首先上兩張圖。

 

 

 

現在要對上面兩張圖進行人臉識別。

 

 

 

 

一、Haar特征分類器介紹

 

 

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

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

 

[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  


根據命名就可以很快知道各個分類器的用途。

 

 

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

 

 

 

二、detectMultiScale函數詳解

 

 

cvHaarDetectObjects是opencv1中的函數,opencv2中人臉檢測使用的是 detectMultiScale函數。它可以檢測出圖片中所有的人臉,並將人臉用vector保存各個人臉的坐標、大小(用矩形表示),函數由分類器對象調用:

 

 

[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--待檢測圖片,一般為灰度圖像加快檢測速度;

參數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邊緣檢測來排除邊緣過多或過少的區域,

        因此這些區域通常不會是人臉所在區域;
參數6、7:minSize和maxSize用來限制得到的目標區域的范圍。

 

 

 

 

 

 

三、示例代碼

 

 

 

[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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM