www.pudn.com > PCA_faceRec_V2.rar > IC_SIMPLEDlg.cpp


// IC_SIMPLEDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "IC_SIMPLE.h" 
#include "IC_SIMPLEDlg.h" 
#include "cdib.h" 
#include "windowsx.h" 
#include "math.h" 
#include "MiDu.h" 
#include "utils.h" 
#include "HaarDetecting.h" 
#include  
 
 
//using namespace std; 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CIC_SIMPLEDlg dialog 
 
CIC_SIMPLEDlg::CIC_SIMPLEDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CIC_SIMPLEDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CIC_SIMPLEDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CIC_SIMPLEDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CIC_SIMPLEDlg) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CIC_SIMPLEDlg, CDialog) 
	//{{AFX_MSG_MAP(CIC_SIMPLEDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1) 
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2) 
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3) 
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4) 
	ON_BN_CLICKED(IDC_BUTTON5, OnButton5) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CIC_SIMPLEDlg message handlers 
 
BOOL CIC_SIMPLEDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CIC_SIMPLEDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CIC_SIMPLEDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CIC_SIMPLEDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CIC_SIMPLEDlg::OnButton1()  
{ 
	// TODO: Add your control notification handler code here 
	// TODO: Add your control notification handler code here 
/* 
   char BASED_CODE szFilter[]="BMP Files (*.bmp)|*.bmp||"; 
   CFileDialog fOpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); 
   
   int nRet=-1; 
   nRet=fOpenDlg.DoModal();  //返回的是一个int 
   //if(nRet==IDCANCLE) return; 
 
   filename=fOpenDlg.GetPathName(); 
 
   if(filename.IsEmpty()) return; 
   filename.Replace("\\","\\\\");//单斜杠转换为双斜杠 
   ShowOn(IDC_STATIC1,filename); 
*/ 
  // 
	//CString tmp; 
	const char* s="Tran\\*.bmp"; 
	string s2="Tran\\"; 
	int PhotoNum=0; 
	string Bigphoto_name[100]; 
    cdib.read_Bigphoto_name(s,PhotoNum,Bigphoto_name); 
 
	BYTE *pt1; 
	int ImgLength; 
	for(int i=0;ibiSizeImage; 
		if(i==0) 
		{ 
		pt1=(BYTE*)malloc(PhotoNum*ImgLength*sizeof(BYTE)); 
		}         
        memcpy(pt1+i*ImgLength,cdib.m_pData,ImgLength*sizeof(BYTE)); 
	} 
 
   float *ave; 
   int *sum=0; 
   ave=(float*)malloc(ImgLength*sizeof(float)); 
   sum=(int*)malloc(ImgLength*sizeof(int));  
	for(i=0;iGetClientRect(&cr);//指向区域的一个指针 
		CDC MemDC; 
		MemDC.CreateCompatibleDC(&ClientDC);//创建一个与指定的pDC配套的memory 设备上下文。 
		hBitmap=(HBITMAP*)::LoadImage(AfxGetInstanceHandle(),filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//LR_LOADFROMFILE); 
        MemDC.SelectObject(hBitmap); 
		::GetObject(hBitmap,sizeof(BM),&BM); 
		ClientDC.SetStretchBltMode( COLORONCOLOR);   //added by zou 
		ClientDC.StretchBlt(0,0,cr.Width(),cr.Height(),&MemDC,0,0,BM.bmWidth,BM.bmHeight,SRCCOPY); 
 
} 
 
void CIC_SIMPLEDlg::OnButton2()  //Open Image  打开一张要找的人脸 
{ 
	// TODO: Add your control notification handler code here	 
    MySize origWindowSize; 
	origWindowSize.height=20;    //最初的采样窗大小  
	origWindowSize.width=20;     // 
	const int maxstep=14;        //最大步长 
	const char* directory="DATA_1号用20000个\\"; 
	ClassifierCascade* cascade=NULL;   // 
	DetCascadeClassifier* detcascade=NULL;  // 
    int nImgWidth,nImgHeight;     // ?? 
     
    cascade=LoadClassifierCascade(directory, maxstep, origWindowSize); 
		if (cascade==NULL) 
	{ 
		AfxMessageBox(" load the data for ClassifierCascade\n"); 
	} 
	 
    MyRect detRegion;	 
    vector* vecFaces=new vector; 
	MySize min_size,max_size; 
	 
	int min_neighbors=2; 
	double scale_factor=1.1F;	 
    int liite_face_count=0; 
    int c=0; 
    int x,y,w,h; 
 
/* 
   char BASED_CODE szFilter[]="BMP Files (*.bmp)|*.bmp||"; 
   CFileDialog fOpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);   
   int nRet=-1; 
   nRet=fOpenDlg.DoModal();  //返回的是一个int 
   filename2=fOpenDlg.GetPathName(); 
   if(filename2.IsEmpty()) return; 
   filename2.Replace("\\","\\\\");//单斜杠转换为双斜杠    //Invalidate(); 刷新函数 
   //Invalidate(); //刷新函数 
*/ 
 
   filename2="temp\\a_1.bmp"; 
   //ShowOn(IDC_STATIC1,filename2); 
 
    
  CString tmp;  
  tmp.Format("%s",filename2); 
  AfxMessageBox(tmp); 
 
 
    BYTE*  pbyteSrcImg=ReadBmpFile(filename2,nImgWidth,nImgHeight);    //读ReadBmpFile灰度BMP文件   
	 
	detcascade=CreateDetCascadeClassifier(cascade,nImgWidth,nImgHeight); 
	 
	detRegion.x=0;detRegion.y=0;detRegion.height=nImgHeight-1; detRegion.width=nImgWidth-1; 
	min_size.width=20; min_size.height=20; max_size.width=(nImgWidth*4)/5; max_size.height=(nImgHeight*4)/5; 
	if (max_size.width>max_size.height) 
	{ 
		max_size.width=max_size.height; 
	} 
	else 
		max_size.height=max_size.width; 
 
   ReleaseClassifierCascade(cascade);  //释放内存 
 
   clock_t start, finish; 
   double  duration;start = clock(); 
   HaarDetectFaces(  pbyteSrcImg,	                  
					 nImgWidth,nImgHeight, 
					 detRegion, 
					 detcascade, 
					 vecFaces, 
					 min_size, 
					 max_size, 
					 min_neighbors, 
					 scale_factor ); 
finish = clock(); 
duration = (double)(finish - start) / CLOCKS_PER_SEC; 
  
//CString tmp;  
tmp.Format("x:%f",duration); 
AfxMessageBox(tmp); 
 
    delete []pbyteSrcImg;    //释放内存 
 
	vector::iterator iter_begin = vecFaces->begin(); 
	vector::iterator iter_end = vecFaces->end(); 
	vector::iterator iter_p; 
 
    ReleaseDetCascadeClassifier(detcascade);  //释放内存 
 
	//******************************************************* 
//******************************************************* 
    cdib.LoadFile(filename2);  
    //nImgHeight=cdib.GetHeight(); 
    //nImgWidth=cdib.GetWidth(); 
	int nImgSize=cdib.GetSize(); 
   for (iter_p=iter_begin;iter_px;y=iter_p->y;w=iter_p->width;h=iter_p->height; 
		y=nImgHeight-y-h;   //  LoadFile读入的数据是倒序的 zou 
   CString tmp; 
   tmp.Format("x:%d,y:%d,w:%d,h:%d",x,y,w,h); 
   AfxMessageBox(tmp); 
  
   
   for (int i=0;iGetClientRect(&cr);//指向区域的一个指针 
   CDC MemDC; 
   MemDC.CreateCompatibleDC(&dc);//创建一个与指定的pDC配套的memory 设备上下文。 
   HBITMAP hBitmap = CreateDIBitmap( dc.m_hDC,// handle to device context  
								cdib.m_pBitmapInfoHeader, // pointer to BITMAPINFOHEADER  
								CBM_INIT, // initialization flag  
								pBitmapData, // pointer to initialization data  
								cdib.m_pBitmapInfo, // pointer to bitmap color-format data  
								DIB_RGB_COLORS); // color-data usage  
 
   MemDC.SelectObject(hBitmap); 
   ::GetObject(hBitmap,sizeof(BM),&BM); 
   dc.SetStretchBltMode( COLORONCOLOR);   //added by zou 
   dc.StretchBlt(0,0,cr.Width(),cr.Height(),&MemDC,0,0,BM.bmWidth,BM.bmHeight,SRCCOPY); 
 
//******************************************************* 
} 
 
void CIC_SIMPLEDlg::OnButton3()  //xxxxxx 
{ 
	// TODO: Add your control notification handler code here 
   char BASED_CODE szFilter[]="BMP Files (*.bmp)|*.bmp||"; 
   CFileDialog fOpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); 
   
   int nRet=-1; 
   nRet=fOpenDlg.DoModal();  //返回的是一个int 
   //if(nRet==IDCANCLE) return; 
 
   filename=fOpenDlg.GetPathName(); 
   if(filename.IsEmpty()) return; 
   filename.Replace("\\","\\\\");//单斜杠转换为双斜杠    //Invalidate(); 刷新函数 
 
   cdib.LoadFile(filename);   
   ShowOn(IDC_STATIC1,filename); 
 
   //******************************* 
   CString tmp; 
   tmp.Format("行数:%d   列数:%d    %d",cdib.GetWidth(),cdib.GetHeight(),cdib.m_pBitmapInfoHeader->biSizeImage); 
   AfxMessageBox(tmp); 
   int W,H; 
   H=cdib.GetHeight(); 
   W=cdib.GetWidth(); 
    
if(cdib.m_pRGB==NULL) // 24位真彩色图 肤色检查 
   { 
	AfxMessageBox("24位真彩色图 肤色检查"); 
	   for (int i=0;iGetClientRect(&cr);//指向区域的一个指针 
   CDC MemDC; 
   MemDC.CreateCompatibleDC(&dc);//创建一个与指定的pDC配套的memory 设备上下文。 
   HBITMAP hBitmap = CreateDIBitmap( dc.m_hDC,// handle to device context  
								cdib.m_pBitmapInfoHeader, // pointer to BITMAPINFOHEADER  
								CBM_INIT, // initialization flag  
								pBitmapData, // pointer to initialization data  
								cdib.m_pBitmapInfo, // pointer to bitmap color-format data  
								DIB_RGB_COLORS); // color-data usage  
 
   MemDC.SelectObject(hBitmap); 
   ::GetObject(hBitmap,sizeof(BM),&BM); 
   dc.SetStretchBltMode( COLORONCOLOR);   //added by zou 
   dc.StretchBlt(0,0,cr.Width(),cr.Height(),&MemDC,0,0,BM.bmWidth,BM.bmHeight,SRCCOPY); 
*/ 
   //显示内存中的数据) 
 
 
 
/************************************************/ 
 
 
/*************************************************/ 
 
} 
 
void CIC_SIMPLEDlg::OnButton4()   //Open Picture 打开一张图象,并开始人脸检测 
{ 
	// TODO: Add your control notification handler code here 
	MySize origWindowSize; 
	origWindowSize.height=20;    //最初的采样窗大小  
	origWindowSize.width=20;     // 
	const int maxstep=14;        //最大步长 
	const char* directory="DATA_1号用20000个\\"; 
	ClassifierCascade* cascade=NULL;   // 
	DetCascadeClassifier* detcascade=NULL;  // 
    int nImgWidth,nImgHeight;     // ?? 
     
    cascade=LoadClassifierCascade(directory, maxstep, origWindowSize); 
		if (cascade==NULL) 
	{ 
		AfxMessageBox(" load the data for ClassifierCascade\n"); 
	} 
	 
    MyRect detRegion;	 
    vector* vecFaces=new vector; 
	MySize min_size,max_size; 
	 
	int min_neighbors=2; 
	double scale_factor=1.1F;	 
    int liite_face_count=0; 
    int c=0; 
    int x,y,w,h; 
 
  /* char BASED_CODE szFilter[]="BMP Files (*.bmp)|*.bmp||"; 
   CFileDialog fOpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);   
   int nRet=-1; 
   nRet=fOpenDlg.DoModal();  //返回的是一个int 
   filename4=fOpenDlg.GetPathName(); 
   if(filename4.IsEmpty()) return; 
   filename4.Replace("\\","\\\\");//单斜杠转换为双斜杠    //Invalidate(); 刷新函数*/ 
 
    
    filename4="tmp\\IMG_2976_sm.bmp"; 
    BYTE*  pbyteSrcImg=ReadBmpFile(filename4,nImgWidth,nImgHeight);    //读ReadBmpFileBMP文件 
	{CString tmp; 
	 tmp.Format("***%d,***%d",nImgWidth,nImgHeight); 
	 AfxMessageBox(tmp); 
	} 
 
    //caise  
		BYTE* Gray=(BYTE*)malloc(nImgWidth*nImgHeight*sizeof(BYTE*)); 
	for (int i=0;imax_size.height) 
	{ 
		max_size.width=max_size.height; 
	} 
	else 
		max_size.height=max_size.width; 
 
   ReleaseClassifierCascade(cascade);  //释放内存 
 
clock_t start, finish; 
double  duration;start = clock(); 
   HaarDetectFaces(  pbyteSrcImg,	                  
					 nImgWidth,nImgHeight, 
					 detRegion, 
					 detcascade, 
					 vecFaces, 
					 min_size, 
					 max_size, 
					 min_neighbors, 
					 scale_factor ); 
finish = clock(); 
duration = (double)(finish - start) / CLOCKS_PER_SEC; 
  
CString tmp;  
tmp.Format("x:%f",duration); 
AfxMessageBox(tmp); 
 
delete []pbyteSrcImg;    //释放内存 
 
	vector::iterator iter_begin = vecFaces->begin(); 
	vector::iterator iter_end = vecFaces->end(); 
	vector::iterator iter_p; 
 
    ReleaseDetCascadeClassifier(detcascade);  //释放内存 
//******************************************************* 
//******************************************************* 
  //filename4="tmp\\black.bmp"; 
   cdib.LoadFile(filename4);  
    //nImgHeight=cdib.GetHeight(); 
    //nImgWidth=cdib.GetWidth(); 
   int nImgSize=nImgHeight*nImgWidth;//cdib.GetSize(); 
   for (iter_p=iter_begin;iter_px;y=iter_p->y;w=iter_p->width;h=iter_p->height; 
		y=nImgHeight-y-h;   //  LoadFile读入的数据是倒序的 zou 
   CString tmp; 
   tmp.Format("x:%d,y:%d,w:%d,h:%d",x,y,w,h); 
   AfxMessageBox(tmp); 
  
   
   for (int i=0;iGetClientRect(&cr);//指向区域的一个指针 
   CDC MemDC; 
   MemDC.CreateCompatibleDC(&dc);//创建一个与指定的pDC配套的memory 设备上下文。 
   HBITMAP hBitmap = CreateDIBitmap( dc.m_hDC,// handle to device context  
								cdib.m_pBitmapInfoHeader, // pointer to BITMAPINFOHEADER  
								CBM_INIT, // initialization flag  
								pBitmapData, // pointer to initialization data  
								cdib.m_pBitmapInfo, // pointer to bitmap color-format data  
								DIB_RGB_COLORS); // color-data usage  
 
   MemDC.SelectObject(hBitmap); 
   ::GetObject(hBitmap,sizeof(BM),&BM); 
   dc.SetStretchBltMode(HALFTONE);//COLORONCOLOR);   //added by zou 
   dc.StretchBlt(0,0,cr.Width(),cr.Height(),&MemDC,0,0,BM.bmWidth,BM.bmHeight,SRCCOPY); 
 
//显示内存中的数据) 
 
 
//******************************************************* 
	 
} 
 
void CIC_SIMPLEDlg::OnButton5()  
{ 
	// TODO: Add your control notification handler code here 
   filename5="tmp\\IMG_2970.bmp"; 
   int nImgWidth; 
   int nImgHeight; 
   CString t; 
   BYTE*  pbyteSrcImg=ReadBmpFile(filename5,nImgWidth,nImgHeight);    //读ReadBmpFile BMP文件 
 
   WriteBmpFile("z.bmp",pbyteSrcImg,nImgWidth,nImgHeight,nImgWidth,nImgHeight,0,0); 
 
   cdib.LoadFile(filename5); 
   //******************************************************* 
   //(显示内存中的数据  added by zou 
  // BYTE* pt=(BYTE *)malloc(nImgSize*sizeof(BYTE)); 
   //memcpy(pt,cdib.m_pData,nImgSize); 
  // cdib.m_pData=NULL; 
 
   BYTE* pBitmapData=pbyteSrcImg; 
   BITMAPINFO* pBitmapInfo=cdib.m_pBitmapInfo; 
   BITMAP BM; 
   CWnd *pWnd=GetDlgItem(IDC_STATIC3);//在IDC_STATIC上画图 
   CClientDC dc(pWnd); 
   CRect cr; 
   pWnd->GetClientRect(&cr);//指向区域的一个指针 
   CDC MemDC; 
   MemDC.CreateCompatibleDC(&dc);//创建一个与指定的pDC配套的memory 设备上下文。 
   HBITMAP hBitmap = CreateDIBitmap( dc.m_hDC,// handle to device context  
								cdib.m_pBitmapInfoHeader, // pointer to BITMAPINFOHEADER  
								CBM_INIT, // initialization flag  
								pBitmapData, // pointer to initialization data  
								cdib.m_pBitmapInfo, // pointer to bitmap color-format data  
								DIB_RGB_COLORS); // color-data usage  
 
   MemDC.SelectObject(hBitmap); 
   ::GetObject(hBitmap,sizeof(BM),&BM); 
   dc.SetStretchBltMode(HALFTONE);//COLORONCOLOR);   //added by zou 
   dc.StretchBlt(0,0,cr.Width(),cr.Height(),&MemDC,0,0,BM.bmWidth,BM.bmHeight,SRCCOPY); 
 
//显示内存中的数据) 
 
   ShowOn(IDC_STATIC1,filename5); 
	 
}