www.pudn.com > FaceDetect.rar > LikelyHood.cpp


////////////////////////////////////////////////////////////////////// 
// LikelyHood.cpp: 类CLikelyHood的接口 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "FaceDetect.h" 
#include "LikelyHood.h" 
 
////////////////////////////////////////////////////////////////////// 
// 构造函数/析构函数 
////////////////////////////////////////////////////////////////////// 
 
CLikelyHood::CLikelyHood() 
{ 
	m_pLikeliHoodArray = NULL; 
	m_pBinaryArray = NULL; 
 
	bmean =  B_Mean; 
	rmean =  R_Mean; 
	brcov[0][0] =  Brcov00; 
	brcov[0][1] =  Brcov01; 
	brcov[1][0] =  Brcov10; 
	brcov[1][1] =  Brcov11; 
} 
 
////////////////////////////////////////////////////////////////////// 
//构造函数: 
//参数:    source-输入图像数据 
//          width-图像宽度 
//          height-图像高度 
////////////////////////////////////////////////////////////////////// 
CLikelyHood::CLikelyHood(RGBQUAD ** source,int width,int height) 
{ 
	int i; 
 
	bmean =  B_Mean; 
	rmean =  R_Mean; 
	brcov[0][0] =  Brcov00; 
	brcov[0][1] =  Brcov01; 
	brcov[1][0] =  Brcov10; 
	brcov[1][1] =  Brcov11; 
 
	m_nWidth = width; 
	m_nHeight= height; 
 
	m_bLikeliHoodReady = false; 
	m_bBinaryReady = false; 
 
	//初始化各数组 
	m_pSourceData = source; 
	m_pLikeliHoodArray = new  double*[height]; 
	for(i=0;i  max)  
				max = m_pLikeliHoodArray[i][j]; 
	 
	for(i=0; i=0;k--) 
	{ 
		double sum = 0; 
		for(i=0; ik*0.1+0.05) 
				m_pBinaryArray[i][j] = 1; 
			else 
				m_pBinaryArray[i][j] = 0; 
			sum += (m_pBinaryArray[i][j]-temp[i][j]); 
		} 
		 
		if(sum < min) 
		{ 
			min = sum; 
			index = 6-k; 
		} 
 
	    for(i=0; ioptimalThreshold) 
			m_pBinaryArray[i][j] = 1; 
		else 
			m_pBinaryArray[i][j] = 0; 
	} 
 
	if(temp!=NULL) 
	{ 
		for(int i=0;i<=m_nHeight-1;i++) 
			if(temp[i]!=NULL) delete temp[i]; 
		delete temp; 
	} 
 
	m_bBinaryReady = true; 
 
	return true; 
} 
 
///////////////////////////////////////////////////////////////////////// 
//功能:训练参数 
//参数:DirectPath-Bmp文件路径 
///////////////////////////////////////////////////////////////////////// 
int CLikelyHood::CalParameter(CString DirectPath) 
{ 
	WIN32_FIND_DATA FindFileData; 
	HANDLE hFind; 
	BOOL  FINDOVER=TRUE; 
	hFind = FindFirstFile(DirectPath+"\\*.bmp", &FindFileData); 
 
	if (hFind == INVALID_HANDLE_VALUE) 
	{ 
		return 0; 
	} 
 
	int filenum = 0; 
	while(FINDOVER) 
	{ 
		CString m_sOpenFileName=DirectPath+FindFileData.cFileName; 
		filenum ++; 
		FINDOVER=FindNextFile(hFind,&FindFileData); 
	} 
	FindClose(hFind); 
 
	double **CrList,**CbList; 
	CrList = new double*[filenum]; 
	CbList = new double*[filenum]; 
 
	int* mapLength = new int[filenum]; 
 
	FINDOVER=TRUE; 
	BOOL FileOK=true; 
	int index = 0; 
	hFind = FindFirstFile(DirectPath+"\\*.bmp", &FindFileData); 
	while(FINDOVER && FileOK) 
	{ 
		CString m_sOpenFileName=DirectPath+"\\"+FindFileData.cFileName; 
		CDib * dib; 
		dib = new CDib(); 
		if(!dib->Open(m_sOpenFileName)) 
		{ 
			AfxMessageBox(m_sOpenFileName+": Invalid File Format! It must be BMP File"); 
			FileOK = false; 
		} 
		if(FileOK) 
		{ 
			int m_nBitMapWidth = dib->GetWidth(); 
			int m_nBitMapHeight= dib->GetHeight(); 
			CrList[index] = new double[m_nBitMapWidth*m_nBitMapHeight]; 
			CbList[index] = new double[m_nBitMapWidth*m_nBitMapHeight]; 
			mapLength[index] = m_nBitMapWidth*m_nBitMapHeight; 
 
			BYTE	*colorTable; 
			colorTable = (BYTE *)dib->m_pDibBits; 
			int byteBitCount  = dib->GetBiBitCount()/8; 
			int count = 0; 
			double **tempCr,**tempCb; 
			tempCr = new  double*[m_nBitMapHeight]; 
			tempCb = new  double*[m_nBitMapHeight]; 
			for(int i=0;i =0; i--) 
			{ 
				for(int j=0; j