X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcvaux%2F_cvfacedetection.h;fp=src%2Fcvaux%2F_cvfacedetection.h;h=8c41be4f1126ce486eda3fdb8336ef61133b1869;hb=e4c14cdbdf2fe805e79cd96ded236f57e7b89060;hp=0000000000000000000000000000000000000000;hpb=454138ff8a20f6edb9b65a910101403d8b520643;p=opencv diff --git a/src/cvaux/_cvfacedetection.h b/src/cvaux/_cvfacedetection.h new file mode 100644 index 0000000..8c41be4 --- /dev/null +++ b/src/cvaux/_cvfacedetection.h @@ -0,0 +1,412 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ +/////////////////////////////////////////////// +//// Created by Khudyakov V.A. bober@gorodok.net +// FaceDetection.h: interface for the FaceDetection class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef _CVFACEDETECTION_H_ +#define _CVFACEDETECTION_H_ + +#define MAX_LAYERS 64 + +class FaceFeature +{ +public: + FaceFeature(double dWeight,void * lpContour,bool bIsFeature); + FaceFeature(); + virtual ~FaceFeature(); + inline bool isFaceFeature(); + inline void * GetContour(); + inline double GetWeight(); + inline void SetContour(void * lpContour); + inline void SetWeight(double dWeight); + inline void SetFeature(bool bIsFeature); +private: + double m_dWeight; + void * m_lpContour; + bool m_bIsFaceFeature; +};//class FaceFeature + +inline void FaceFeature::SetFeature(bool bIsFeature) +{ + m_bIsFaceFeature = bIsFeature; +} + +inline bool FaceFeature::isFaceFeature() +{ + return m_bIsFaceFeature; +}//inline bool FaceFeature::isFaceFeature() + +inline void * FaceFeature::GetContour() +{ + return m_lpContour; +}//inline void * FaceFeature::GetContour() + +inline double FaceFeature::GetWeight() +{ + return m_dWeight; +}//inline long FaceFeature::GetWeight() + +inline void FaceFeature::SetContour(void * lpContour) +{ + m_lpContour = lpContour; +}//inline void FaceFeature::SetContour(void * lpContour) + +inline void FaceFeature::SetWeight(double dWeight) +{ + m_dWeight = dWeight; +}//inline void FaceFeature::SetWeight(double * dWeight) + + + +class FaceTemplate +{ +public: + FaceTemplate(long lFeatureCount) {m_lFeaturesCount = lFeatureCount; m_lpFeaturesList = new FaceFeature[lFeatureCount];}; + virtual ~FaceTemplate(); + + inline long GetCount(); + inline FaceFeature * GetFeatures(); + +protected: + FaceFeature * m_lpFeaturesList; +private: + long m_lFeaturesCount; +};//class FaceTemplate + + +inline long FaceTemplate::GetCount() +{ + return m_lFeaturesCount; +}//inline long FaceTemplate::GetCount() + + +inline FaceFeature * FaceTemplate::GetFeatures() +{ + return m_lpFeaturesList; +}//inline FaceFeature * FaceTemplate::GetFeatures() + +//////////// +//class RFaceTemplate +/////////// + +class MouthFaceTemplate:public FaceTemplate +{ +public: + inline MouthFaceTemplate(long lNumber,CvRect rect,double dEyeWidth,double dEyeHeight,double dDistanceBetweenEye,double dDistanceEyeAboveMouth); + ~MouthFaceTemplate(); +};//class MouthFaceTemplate:public FaceTemplate + + +inline MouthFaceTemplate::MouthFaceTemplate(long lNumber,CvRect rect,double dEyeWidth,double dEyeHeight, + double dDistanceBetweenEye,double dDistanceEyeAboveMouth):FaceTemplate(lNumber) +{ + + CvRect MouthRect = rect; + + + CvRect LeftEyeRect = cvRect(cvRound(rect.x - (dEyeWidth + dDistanceBetweenEye/(double)2 - (double)rect.width/(double)2)), + cvRound(rect.y - dDistanceEyeAboveMouth - dEyeHeight), + cvRound(dEyeWidth), + cvRound(dEyeHeight) ); + + CvRect RightEyeRect = cvRect(cvRound(rect.x + (double)rect.width/(double)2 + dDistanceBetweenEye/(double)2), + cvRound(rect.y - dDistanceEyeAboveMouth - dEyeHeight), + cvRound(dEyeWidth), + cvRound(dEyeHeight) ); + +// CvRect NoseRect = cvRect(cvRound(rect.x + (double)rect.width/(double)4), +// cvRound(rect.y - (double)rect.width/(double)2 - (double)rect.height/(double)4), +// cvRound((double)rect.width/(double)2), +// cvRound((double)rect.width/(double)2) ); +/* + CvRect CheenRect = cvRect(rect.x,rect.y + 3*rect.height/2,rect.width,rect.height); + +*/ + + CvRect * lpMouthRect = new CvRect(); + *lpMouthRect = MouthRect; + m_lpFeaturesList[0].SetContour(lpMouthRect); + m_lpFeaturesList[0].SetWeight(1); + m_lpFeaturesList[0].SetFeature(false); + + + CvRect * lpLeftEyeRect = new CvRect(); + *lpLeftEyeRect = LeftEyeRect; + m_lpFeaturesList[1].SetContour(lpLeftEyeRect); + m_lpFeaturesList[1].SetWeight(1); + m_lpFeaturesList[1].SetFeature(true); + + CvRect * lpRightEyeRect = new CvRect(); + *lpRightEyeRect = RightEyeRect; + m_lpFeaturesList[2].SetContour(lpRightEyeRect); + m_lpFeaturesList[2].SetWeight(1); + m_lpFeaturesList[2].SetFeature(true); + + +// CvRect * lpNoseRect = new CvRect(); +// *lpNoseRect = NoseRect; +// m_lpFeaturesList[3].SetContour(lpNoseRect); +// m_lpFeaturesList[3].SetWeight(0); +// m_lpFeaturesList[3].SetFeature(true); + +/* CvRect * lpCheenRect = new CvRect(); + *lpCheenRect = CheenRect; + m_lpFeaturesList[4].SetContour(lpCheenRect); + m_lpFeaturesList[4].SetWeight(1); + m_lpFeaturesList[4].SetFeature(false); + +*/ + +}//constructor MouthFaceTemplate(long lNumFeatures,CvRect rect,double dEyeWidth,double dEyeHeight,double dDistanceBetweenEye,double dDistanceEyeAboveMouth); + + +typedef struct CvContourRect +{ + int iNumber; + int iType; + int iFlags; + CvSeq *seqContour; + int iContourLength; + CvRect r; + CvPoint pCenter; + int iColor; +} CvContourRect; + +class Face +{ +public: + Face(FaceTemplate * lpFaceTemplate); + virtual ~Face(); + + inline bool isFeature(void * lpElem); + + virtual void Show(IplImage * /*Image*/){}; + virtual void ShowIdeal(IplImage* /*Image*/){}; + + virtual void CreateFace(void * lpData) = 0; + virtual bool CheckElem(void * lpCandidat,void * lpIdeal) = 0; + virtual double GetWeight() = 0; +protected: + FaceFeature * m_lpIdealFace;//ideal face definition + long m_lFaceFeaturesNumber; //total number of diferent face features + long * m_lplFaceFeaturesCount;//number of each features fouded for this face + FaceFeature ** m_lppFoundedFaceFeatures;//founded features of curen face + double m_dWeight; +}; + +inline bool Face::isFeature(void * lpElem) +{ + for (int i = 0;i < m_lFaceFeaturesNumber;i ++) + { + void * lpIdeal = m_lpIdealFace[i].GetContour(); + + if ( CheckElem( lpElem,lpIdeal) ) + { + if (m_lplFaceFeaturesCount[i] < 3*MAX_LAYERS) + { + double dWeight = m_lpIdealFace[i].GetWeight(); + bool bIsFeature = m_lpIdealFace[i].isFaceFeature(); + + + if (bIsFeature) + { + m_lppFoundedFaceFeatures[i][m_lplFaceFeaturesCount[i]].SetWeight(dWeight); + m_lppFoundedFaceFeatures[i][m_lplFaceFeaturesCount[i]].SetContour(lpElem); + m_lppFoundedFaceFeatures[i][m_lplFaceFeaturesCount[i]].SetFeature(bIsFeature); + m_lplFaceFeaturesCount[i] ++; + } + + m_dWeight += dWeight; + + if (bIsFeature) + return true; + } + } + + } + + return false; +}//inline bool RFace::isFeature(void * lpElem); + + +struct FaceData +{ + CvRect LeftEyeRect; + CvRect RightEyeRect; + CvRect MouthRect; + double Error; +};//struct FaceData + +class RFace:public Face +{ +public: + RFace(FaceTemplate * lpFaceTemplate); + virtual ~RFace(); + virtual bool CheckElem(void * lpCandidat,void * lpIdeal); + virtual void CreateFace(void * lpData); + virtual void Show(IplImage* Image); + virtual void ShowIdeal(IplImage* Image); + virtual double GetWeight(); +private: + bool isPointInRect(CvPoint p,CvRect rect); + bool m_bIsGenerated; + void ResizeRect(CvRect Rect,CvRect * lpRect,long lDir,long lD); + void CalculateError(FaceData * lpFaceData); +}; + + +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; +} + +//////////// +//class RFaceTemplate +/////////// + +class BoostingFaceTemplate:public FaceTemplate +{ +public: + inline BoostingFaceTemplate(long lNumber,CvRect rect); + ~BoostingFaceTemplate() {}; +};//class RFaceTemplate:public FaceTemplate + + +inline BoostingFaceTemplate::BoostingFaceTemplate(long lNumber,CvRect rect):FaceTemplate(lNumber) +{ + long EyeWidth = rect.width/5; + long EyeHeight = EyeWidth; + + CvRect LeftEyeRect = cvRect(rect.x + EyeWidth,rect.y + rect.height/2 - EyeHeight,EyeWidth,EyeHeight); + CvRect RightEyeRect = cvRect(rect.x + 3*EyeWidth,rect.y + rect.height/2 - EyeHeight,EyeWidth,EyeHeight); + CvRect MouthRect = cvRect(rect.x + 3*EyeWidth/2,rect.y + 3*rect.height/4 - EyeHeight/2,2*EyeWidth,EyeHeight); + + CvRect * lpMouthRect = new CvRect(); + *lpMouthRect = MouthRect; + m_lpFeaturesList[0].SetContour(lpMouthRect); + m_lpFeaturesList[0].SetWeight(1); + m_lpFeaturesList[0].SetFeature(true); + + CvRect * lpLeftEyeRect = new CvRect(); + *lpLeftEyeRect = LeftEyeRect; + m_lpFeaturesList[1].SetContour(lpLeftEyeRect); + m_lpFeaturesList[1].SetWeight(1); + m_lpFeaturesList[1].SetFeature(true); + + CvRect * lpRightEyeRect = new CvRect(); + *lpRightEyeRect = RightEyeRect; + m_lpFeaturesList[2].SetContour(lpRightEyeRect); + m_lpFeaturesList[2].SetWeight(1); + m_lpFeaturesList[2].SetFeature(true); + +}//inline BoostingFaceTemplate::BoostingFaceTemplate(long lNumber,CvRect rect):FaceTemplate(lNumber) + +#endif // !defined(AFX_FACEDETECTION_H__55865033_D8E5_4DD5_8925_34C2285BB1BE__INCLUDED_)