OpenCV人脸检测例程的简单应用

OpenCV自带的AdaBoot检测器对人脸检测有着很好的效果,对于双眼的检测结果也很不错,前提是人脸足够大,如大小为320x240的一帧图像,人脸达到150x150大小。

    本文简单的包装了一下这个检测器。

  1.     
  2. #if !defined(AFX_HARR_DETECTOR_H_INCLUDED)  
  3. #define AFX_HARR_DETECTOR_H_INCLUDED  
  4. #if _MSC_VER > 1000  
  5. #pragma once  
  6. #endif // _MSC_VER > 1000  
  7. #include "cv.h"  
  8. #include "highgui.h"  
  9. #include <stdio.h>  
  10. #include <stdlib.h>  
  11. #include <string.h>  
  12. #include <assert.h>  
  13. #include <math.h>  
  14. #include <float.h>  
  15. #include <limits.h>  
  16. #include <time.h>  
  17. #include <ctype.h>  
  18. typedef struct {  
  19.     int    m_ScaleImg;  
  20.     double m_ScaleFactor;  
  21.     int    m_MinNeighbors;  
  22.     bool   m_FlagsDoCanny;  
  23.     CvSize m_MinSize;  
  24. } HarrParam;  
  25. class CHarrDetector  
  26. {  
  27. public:   
  28.     void Process(IplImage *image, const CvRect *pRoi)  
  29.     {  
  30.         assert(image != NULL);  
  31.         assert(image->nChannels == 1);  
  32.         IplImage* gray = image;  
  33.         IplImage* small_img;  
  34.         int i, isFaceFound = 0;  
  35.         CvRect roi;  
  36.         m_bFound  = false;  
  37.         if (m_SmallImage == NULL)  
  38.         {  
  39.             m_SmallImage = cvCreateImage(   
  40.                 cvSize( cvRound (image->width/m_ScaleImg),  
  41.                 cvRound (image->height/m_ScaleImg)),  
  42.                 8, 1 );  
  43.         }  
  44.         small_img = m_SmallImage;  
  45.         cvResize( gray, small_img, CV_INTER_LINEAR );  
  46.         cvEqualizeHist( small_img, small_img );  
  47.         cvClearMemStorage( m_storage );  
  48.         if (pRoi != NULL)  
  49.         {  
  50.             roi = *pRoi;  
  51.             roi.x /= m_ScaleImg;  
  52.             roi.y /= m_ScaleImg;  
  53.             roi.width /= m_ScaleImg;  
  54.             roi.height/= m_ScaleImg;  
  55.             cvSetImageROI(small_img , roi);  
  56.         }  
  57.         if( m_cascade )  
  58.         {  
  59.             CvSeq* faces = cvHaarDetectObjects( small_img,   
  60.                 m_cascade,   
  61.                 m_storage,  
  62.                 m_ScaleFactor,   
  63.                 m_MinNeighbors,   
  64.                 m_FlagsDoCanny,   
  65.                 m_MinSize );  
  66.             m_bFound         = false;  
  67.             m_Blob.height = 0;  
  68.             m_Blob.width  = 0;  
  69.             for( i = 0; i < (faces ? faces->total : 0); i++ )  
  70.             {  
  71.                 CvRect* r = (CvRect*)cvGetSeqElem( faces, i );  
  72.                 CvRect  rect;  
  73.                 rect.x      = r->x * m_ScaleImg;  
  74.                 rect.y      = r->y * m_ScaleImg;  
  75.                 rect.height = r->height * m_ScaleImg;  
  76.                 rect.width  = r->width  * m_ScaleImg;  
  77.                 if (pRoi != NULL)  
  78.                 {  
  79.                     rect.x      += pRoi->x;  
  80.                     rect.y      += pRoi->y;  
  81.                 }  
  82.                 m_bFound  = true;  
  83.                 if (m_Blob.height < rect.height  
  84.                     && m_Blob.width < rect.width)  
  85.                 {  
  86.                     m_Blob = rect;  
  87.                 }  
  88.             }  
  89.         }  
  90.         if (pRoi != NULL)  
  91.         {  
  92.             cvResetImageROI(small_img);  
  93.         }  
  94.     };  
  95.     void SetParam(HarrParam *pParam)  
  96.     {  
  97.         assert(pParam != NULL);  
  98.         m_ScaleImg     = pParam->m_ScaleImg;  
  99.         m_ScaleFactor  = pParam->m_ScaleFactor;  
  100.         m_MinNeighbors = pParam->m_MinNeighbors-1;  
  101.         m_FlagsDoCanny = pParam->m_FlagsDoCanny;  
  102.         m_MinSize      = pParam->m_MinSize;  
  103.     };  
  104.     void Init(const char *cascade_name)  
  105.     {  
  106.         assert(cascade_name != NULL);  
  107.         m_cascade      = NULL;  
  108.         m_storage      = NULL;  
  109.         m_SmallImage   = NULL;  
  110.         m_ScaleImg     = 4;  
  111.         m_ScaleFactor  = 1.1f;  
  112.         m_MinNeighbors = -1;  
  113.         m_FlagsDoCanny = 0;  
  114.         m_MinSize      = cvSize(30, 30);  
  115.       
  116.         if (m_cascade == NULL)  
  117.         {  
  118.             m_cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name,   
  119.                 0, 0, 0 );  
  120.         }  
  121.         assert(m_cascade != NULL);  
  122.         m_storage = cvCreateMemStorage(0);  
  123.         assert(m_storage != NULL);  
  124.     };  
  125.     CHarrDetector()  
  126.     {  
  127.         m_bFound = false;  
  128.     };  
  129.     ~CHarrDetector()  
  130.     {  
  131.         if (m_SmallImage != NULL)  
  132.         {  
  133.             cvReleaseImage(&m_SmallImage);  
  134.         }  
  135.         if (m_storage != NULL)  
  136.         {  
  137.             cvReleaseMemStorage( &m_storage );  
  138.         }  
  139.     };  
  140. public:  
  141.     bool   m_bFound;  
  142.     CvRect m_Blob;  
  143. private:  
  144.     int    m_ScaleImg;  
  145.     double m_ScaleFactor;  
  146.     int    m_MinNeighbors;  
  147.     int    m_FlagsDoCanny;  
  148.     CvSize m_MinSize;  
  149. private:  
  150.     CvHaarClassifierCascade* m_cascade;  
  151.     CvMemStorage *m_storage;  
  152.     IplImage *m_SmallImage;  
  153. };  
  154. class CFaceFounder : public CHarrDetector  
  155. {  
  156. public:  
  157.     CFaceFounder()  
  158.     {  
  159.         const char *cascade_name = "C://Program Files//OpenCV//data//haarcascades//haarcascade_frontalface_alt2.xml";  
  160.         Init(cascade_name);  
  161.         HarrParam param;  
  162.         param.m_FlagsDoCanny = 0;  
  163.         param.m_MinNeighbors = -1;  
  164.         param.m_MinSize      = cvSize(30, 30);  
  165.         param.m_ScaleFactor  = 1.8f;  
  166.         param.m_ScaleImg     = 4;  
  167.         SetParam(&param);  
  168.     };  
  169. };  
  170. class CEyesFounder : public CHarrDetector  
  171. {  
  172. public:  
  173.     CEyesFounder()  
  174.     {  
  175.         const char *cascade_name = "C://Program Files//OpenCV//data//haarcascades//Eyes45x11.xml";  
  176.         Init(cascade_name);  
  177.         HarrParam param;  
  178.         param.m_FlagsDoCanny = 0;  
  179.         param.m_MinNeighbors = -1;  
  180.         param.m_MinSize      = cvSize(45, 11);  
  181.         param.m_ScaleFactor  = 1.1f;  
  182.         param.m_ScaleImg     = 2;  
  183.         SetParam(&param);  
  184.     };  
  185. };  
  186. class CMouthFounder : public CHarrDetector  
  187. {  
  188. public:  
  189.     CMouthFounder()  
  190.     {  
  191.         const char *cascade_name = "C://Program Files//OpenCV//data//haarcascades//Mouth25x15.xml";  
  192.         Init(cascade_name);  
  193.         HarrParam param;  
  194.         param.m_FlagsDoCanny = 0;  
  195.         param.m_MinNeighbors = -1;  
  196.         param.m_MinSize      = cvSize(25, 15);  
  197.         param.m_ScaleFactor  = 1.1f;  
  198.         param.m_ScaleImg     = 2;  
  199.         SetParam(&param);  
  200.     };  
  201. };  
  202. class CNoseFounder : public CHarrDetector  
  203. {  
  204. public:  
  205.     CNoseFounder()  
  206.     {  
  207.         const char *cascade_name = "C://Program Files//OpenCV//data//haarcascades//Nose25x15.xml";  
  208.         Init(cascade_name);  
  209.         HarrParam param;  
  210.         param.m_FlagsDoCanny = 0;  
  211.         param.m_MinNeighbors = -1;  
  212.         param.m_MinSize      = cvSize(25, 15);  
  213.         param.m_ScaleFactor  = 1.1f;  
  214.         param.m_ScaleImg     = 2;  
  215.         SetParam(&param);  
  216.     };  
  217. };  
  218. #endif // !defined(AFX_HARR_DETECTOR_H_INCLUDED) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值