16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////// 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//// Created by Khudyakov V.A. bober@gorodok.net 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// FaceDetection.h: interface for the FaceDetection class. 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn////////////////////////////////////////////////////////////////////// 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef _CVFACEDETECTION_H_ 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CVFACEDETECTION_H_ 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define MAX_LAYERS 64 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass FaceFeature 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceFeature(double dWeight,void * lpContour,bool bIsFeature); 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceFeature(); 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~FaceFeature(); 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline bool isFaceFeature(); 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline void * GetContour(); 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline double GetWeight(); 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline void SetContour(void * lpContour); 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline void SetWeight(double dWeight); 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline void SetFeature(bool bIsFeature); 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprivate: 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double m_dWeight; 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void * m_lpContour; 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool m_bIsFaceFeature; 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//class FaceFeature 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void FaceFeature::SetFeature(bool bIsFeature) 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_bIsFaceFeature = bIsFeature; 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline bool FaceFeature::isFaceFeature() 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return m_bIsFaceFeature; 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline bool FaceFeature::isFaceFeature() 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void * FaceFeature::GetContour() 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return m_lpContour; 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline void * FaceFeature::GetContour() 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline double FaceFeature::GetWeight() 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return m_dWeight; 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline long FaceFeature::GetWeight() 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void FaceFeature::SetContour(void * lpContour) 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpContour = lpContour; 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline void FaceFeature::SetContour(void * lpContour) 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void FaceFeature::SetWeight(double dWeight) 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_dWeight = dWeight; 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline void FaceFeature::SetWeight(double * dWeight) 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass FaceTemplate 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceTemplate(long lFeatureCount) {m_lFeaturesCount = lFeatureCount; m_lpFeaturesList = new FaceFeature[lFeatureCount];}; 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~FaceTemplate(); 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline long GetCount(); 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline FaceFeature * GetFeatures(); 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceFeature * m_lpFeaturesList; 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprivate: 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long m_lFeaturesCount; 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//class FaceTemplate 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline long FaceTemplate::GetCount() 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return m_lFeaturesCount; 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline long FaceTemplate::GetCount() 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline FaceFeature * FaceTemplate::GetFeatures() 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return m_lpFeaturesList; 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline FaceFeature * FaceTemplate::GetFeatures() 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////// 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//class RFaceTemplate 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////// 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass MouthFaceTemplate:public FaceTemplate 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline MouthFaceTemplate(long lNumber,CvRect rect,double dEyeWidth,double dEyeHeight,double dDistanceBetweenEye,double dDistanceEyeAboveMouth); 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ~MouthFaceTemplate(); 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//class MouthFaceTemplate:public FaceTemplate 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline MouthFaceTemplate::MouthFaceTemplate(long lNumber,CvRect rect,double dEyeWidth,double dEyeHeight, 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dDistanceBetweenEye,double dDistanceEyeAboveMouth):FaceTemplate(lNumber) 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect MouthRect = rect; 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect LeftEyeRect = cvRect(cvRound(rect.x - (dEyeWidth + dDistanceBetweenEye/(double)2 - (double)rect.width/(double)2)), 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRound(rect.y - dDistanceEyeAboveMouth - dEyeHeight), 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRound(dEyeWidth), 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRound(dEyeHeight) ); 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect RightEyeRect = cvRect(cvRound(rect.x + (double)rect.width/(double)2 + dDistanceBetweenEye/(double)2), 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRound(rect.y - dDistanceEyeAboveMouth - dEyeHeight), 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRound(dEyeWidth), 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRound(dEyeHeight) ); 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// CvRect NoseRect = cvRect(cvRound(rect.x + (double)rect.width/(double)4), 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// cvRound(rect.y - (double)rect.width/(double)2 - (double)rect.height/(double)4), 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// cvRound((double)rect.width/(double)2), 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// cvRound((double)rect.width/(double)2) ); 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect CheenRect = cvRect(rect.x,rect.y + 3*rect.height/2,rect.width,rect.height); 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/ 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect * lpMouthRect = new CvRect(); 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpMouthRect = MouthRect; 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[0].SetContour(lpMouthRect); 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[0].SetWeight(1); 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[0].SetFeature(false); 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect * lpLeftEyeRect = new CvRect(); 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpLeftEyeRect = LeftEyeRect; 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[1].SetContour(lpLeftEyeRect); 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[1].SetWeight(1); 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[1].SetFeature(true); 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect * lpRightEyeRect = new CvRect(); 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpRightEyeRect = RightEyeRect; 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[2].SetContour(lpRightEyeRect); 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[2].SetWeight(1); 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[2].SetFeature(true); 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// CvRect * lpNoseRect = new CvRect(); 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// *lpNoseRect = NoseRect; 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// m_lpFeaturesList[3].SetContour(lpNoseRect); 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// m_lpFeaturesList[3].SetWeight(0); 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// m_lpFeaturesList[3].SetFeature(true); 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* CvRect * lpCheenRect = new CvRect(); 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpCheenRect = CheenRect; 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[4].SetContour(lpCheenRect); 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[4].SetWeight(1); 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[4].SetFeature(false); 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/ 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//constructor MouthFaceTemplate(long lNumFeatures,CvRect rect,double dEyeWidth,double dEyeHeight,double dDistanceBetweenEye,double dDistanceEyeAboveMouth); 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvContourRect 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iNumber; 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iType; 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iFlags; 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq *seqContour; 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iContourLength; 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect r; 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint pCenter; 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iColor; 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} CvContourRect; 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass Face 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Face(FaceTemplate * lpFaceTemplate); 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~Face(); 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline bool isFeature(void * lpElem); 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Show(IplImage * /*Image*/){}; 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void ShowIdeal(IplImage* /*Image*/){}; 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void CreateFace(void * lpData) = 0; 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool CheckElem(void * lpCandidat,void * lpIdeal) = 0; 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual double GetWeight() = 0; 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceFeature * m_lpIdealFace;//ideal face definition 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long m_lFaceFeaturesNumber; //total number of diferent face features 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long * m_lplFaceFeaturesCount;//number of each features fouded for this face 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceFeature ** m_lppFoundedFaceFeatures;//founded features of curen face 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double m_dWeight; 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline bool Face::isFeature(void * lpElem) 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for (int i = 0;i < m_lFaceFeaturesNumber;i ++) 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void * lpIdeal = m_lpIdealFace[i].GetContour(); 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if ( CheckElem( lpElem,lpIdeal) ) 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (m_lplFaceFeaturesCount[i] < 3*MAX_LAYERS) 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dWeight = m_lpIdealFace[i].GetWeight(); 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool bIsFeature = m_lpIdealFace[i].isFaceFeature(); 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (bIsFeature) 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lppFoundedFaceFeatures[i][m_lplFaceFeaturesCount[i]].SetWeight(dWeight); 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lppFoundedFaceFeatures[i][m_lplFaceFeaturesCount[i]].SetContour(lpElem); 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lppFoundedFaceFeatures[i][m_lplFaceFeaturesCount[i]].SetFeature(bIsFeature); 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lplFaceFeaturesCount[i] ++; 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_dWeight += dWeight; 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (bIsFeature) 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline bool RFace::isFeature(void * lpElem); 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct FaceData 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect LeftEyeRect; 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect RightEyeRect; 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect MouthRect; 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double Error; 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//struct FaceData 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RFace:public Face 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn RFace(FaceTemplate * lpFaceTemplate); 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~RFace(); 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool CheckElem(void * lpCandidat,void * lpIdeal); 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void CreateFace(void * lpData); 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Show(IplImage* Image); 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void ShowIdeal(IplImage* Image); 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual double GetWeight(); 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprivate: 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool isPointInRect(CvPoint p,CvRect rect); 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool m_bIsGenerated; 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void ResizeRect(CvRect Rect,CvRect * lpRect,long lDir,long lD); 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void CalculateError(FaceData * lpFaceData); 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass ListElem 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ListElem(); 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ListElem(Face * pFace,ListElem * pHead); 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~ListElem(); 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ListElem * m_pNext; 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ListElem * m_pPrev; 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Face * m_pFace; 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//class ListElem 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass List 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn List(); 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int AddElem(Face * pFace); 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~List(); 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Face* GetData(); 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long m_FacesCount; 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprivate: 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ListElem * m_pHead; 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ListElem * m_pCurElem; 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//class List 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass FaceDetection 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void FindFace(IplImage* img); 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void CreateResults(CvSeq * lpSeq); 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FaceDetection(); 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~FaceDetection(); 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void SetBoosting(bool bBoosting) {m_bBoosting = bBoosting;} 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool isPostBoosting() {return m_bBoosting;} 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IplImage* m_imgGray; 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IplImage* m_imgThresh; 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_iNumLayers; 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* m_mstgContours; 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* m_seqContours[MAX_LAYERS]; 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* m_mstgRects; 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* m_seqRects; 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool m_bBoosting; 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn List * m_pFaceList; 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void ResetImage(); 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void FindContours(IplImage* imgGray); 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void AddContours2Rect(CvSeq* seq, int color, int iLayer); 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void ThresholdingParam(IplImage* imgGray, int iNumLayers, int& iMinLevel, int& iMaxLevel, int& iStep); 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void FindCandidats(); 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PostBoostingFindCandidats(IplImage * FaceImage); 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline void ReallocImage(IplImage** ppImage, CvSize sz, long lChNum) 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IplImage* pImage; 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( ppImage == NULL ) 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return; 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pImage = *ppImage; 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( pImage != NULL ) 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (pImage->width != sz.width || pImage->height != sz.height || pImage->nChannels != lChNum) 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseImage( &pImage ); 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( pImage == NULL ) 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pImage = cvCreateImage( sz, IPL_DEPTH_8U, lChNum); 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *ppImage = pImage; 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////// 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//class RFaceTemplate 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////// 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass BoostingFaceTemplate:public FaceTemplate 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inline BoostingFaceTemplate(long lNumber,CvRect rect); 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ~BoostingFaceTemplate() {}; 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};//class RFaceTemplate:public FaceTemplate 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline BoostingFaceTemplate::BoostingFaceTemplate(long lNumber,CvRect rect):FaceTemplate(lNumber) 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long EyeWidth = rect.width/5; 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn long EyeHeight = EyeWidth; 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect LeftEyeRect = cvRect(rect.x + EyeWidth,rect.y + rect.height/2 - EyeHeight,EyeWidth,EyeHeight); 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect RightEyeRect = cvRect(rect.x + 3*EyeWidth,rect.y + rect.height/2 - EyeHeight,EyeWidth,EyeHeight); 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect MouthRect = cvRect(rect.x + 3*EyeWidth/2,rect.y + 3*rect.height/4 - EyeHeight/2,2*EyeWidth,EyeHeight); 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect * lpMouthRect = new CvRect(); 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpMouthRect = MouthRect; 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[0].SetContour(lpMouthRect); 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[0].SetWeight(1); 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[0].SetFeature(true); 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect * lpLeftEyeRect = new CvRect(); 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpLeftEyeRect = LeftEyeRect; 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[1].SetContour(lpLeftEyeRect); 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[1].SetWeight(1); 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[1].SetFeature(true); 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect * lpRightEyeRect = new CvRect(); 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *lpRightEyeRect = RightEyeRect; 4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[2].SetContour(lpRightEyeRect); 4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[2].SetWeight(1); 4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_lpFeaturesList[2].SetFeature(true); 4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}//inline BoostingFaceTemplate::BoostingFaceTemplate(long lNumber,CvRect rect):FaceTemplate(lNumber) 4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif // !defined(AFX_FACEDETECTION_H__55865033_D8E5_4DD5_8925_34C2285BB1BE__INCLUDED_) 413