facedetection.h 2.43 KB
Newer Older
wester committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
// FaceDetection.h: interface for the FaceDetection class.
//
//////////////////////////////////////////////////////////////////////

#ifndef _CVFACEDETECTION_H_
#define _CVFACEDETECTION_H_

#include "cvfacetemplate.h"
#include "cvface.h"
#include "cvboostingtemplate.h"

typedef struct CvContourRect
{
    int		iNumber;  //  
    int		iType;    // 
    int		iFlags;   // 
    CvSeq	*seqContour; //   
    int		iContourLength;  //  
    CvRect	r;    // 
    CvPoint pCenter; // center of rect
    int		iColor;//      
} CvContourRect;

//class Face;

class ListElem
{
public:
    ListElem();
    ListElem(Face * pFace,ListElem * pHead);
    virtual ~ListElem();
    ListElem * m_pNext;
    ListElem * m_pPrev;
    Face * m_pFace;
};//class ListElem

class List
{
public:
    List();
    int AddElem(Face * pFace);
    virtual ~List();
    Face* GetData();
        long m_FacesCount;
private:
    ListElem * m_pHead;
    ListElem * m_pCurElem;
};//class List


class FaceDetection
{
public:
    void FindFace(IplImage* img);
    void CreateResults(CvSeq * lpSeq);
    FaceDetection();
    virtual ~FaceDetection();
    void SetBoosting(bool bBoosting) {m_bBoosting = bBoosting;}
    bool isPostBoosting() {return m_bBoosting;}
protected:

    IplImage* m_imgGray;
    IplImage* m_imgThresh;
    int m_iNumLayers;
    CvMemStorage* m_mstgContours;
    CvSeq* m_seqContours[MAX_LAYERS];
    CvMemStorage* m_mstgRects;
    CvSeq* m_seqRects;

    bool m_bBoosting;
    List * m_pFaceList;

protected:
    void ResetImage();
    void FindContours(IplImage* imgGray);
    void AddContours2Rect(CvSeq*  seq, int color, int iLayer);
    void ThresholdingParam(IplImage* imgGray, int iNumLayers, int& iMinLevel, int& iMaxLevel, int& iStep);
    void FindCandidats();
    void PostBoostingFindCandidats(IplImage * FaceImage);
};

inline void ReallocImage(IplImage** ppImage, CvSize sz, long lChNum)
{
    IplImage* pImage;
    if( ppImage == NULL )
        return;
    pImage = *ppImage;
    if( pImage != NULL )
    {
        if (pImage->width != sz.width || pImage->height != sz.height || pImage->nChannels != lChNum)
            cvReleaseImage( &pImage );
    }
    if( pImage == NULL )
        pImage = cvCreateImage( sz, IPL_DEPTH_8U, lChNum);
    *ppImage = pImage;
};



#endif // !defined(AFX_FACEDETECTION_H__55865033_D8E5_4DD5_8925_34C2285BB1BE__INCLUDED_)