www.pudn.com > FaceDetect.part1.rar > LikelyHood.cpp
//////////////////////////////////////////////////////////////////////
// LikelyHood.cpp: 类CLikelyHood的接口
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "facedetect.h"
#include "LikelyHood.h"
/*
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
*/
//////////////////////////////////////////////////////////////////////
// 构造函数/析构函数
//////////////////////////////////////////////////////////////////////
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