⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 facedetectdoc.cpp

📁 人脸识别因其在安全验证系统、信用卡验证、医学、档案管理、视频会 议、人机交互、系统公安(罪犯识别等)等方面的巨大应用前景而越来越成为 当前模式识别和人工智能领域的一个研究热点。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// FaceDetectDoc.cpp : implementation of the CFaceDetectDoc class
//

#include "stdafx.h"
#include "FaceDetect.h"
#include "DIB.h"
#include "FaceDetectDoc.h"
#include "FaceDetectView.h"
#include "LikelyHood.h"
#include "math.h"
#define WIDTHBYTES(bits)  ((bits+31)/32*4)
//#include "ReplaceDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern HANDLE hDIB;
extern HANDLE hDIB1;
extern HANDLE hDIBTemp;
extern HANDLE hDIBTemp1;
extern class DIB gDib;
extern int gheight;
extern int gwidth;
extern WORD gwBytesPerLine;
#define IDC_BMPSHOW                     1000

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectDoc

IMPLEMENT_DYNCREATE(CFaceDetectDoc, CDocument)

BEGIN_MESSAGE_MAP(CFaceDetectDoc, CDocument)
	//{{AFX_MSG_MAP(CFaceDetectDoc)
	ON_COMMAND(ID_READY_GetFaceOutLline, OnREADYGetFaceOutLline)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectDoc construction/destruction

CFaceDetectDoc::CFaceDetectDoc()
{
	// TODO: add one-time construction code here
	 m_bFaceOK = false;
	


}

CFaceDetectDoc::~CFaceDetectDoc()
{
}

BOOL CFaceDetectDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CFaceDetectDoc serialization

void CFaceDetectDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectDoc diagnostics

#ifdef _DEBUG
void CFaceDetectDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CFaceDetectDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectDoc commands
BOOL CFaceDetectDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	if(hDIB)
		GlobalFree(hDIB);
	   path=lpszPathName;
	hDIB = gDib.LoadDIB(lpszPathName);
	ASSERT(hDIB != NULL);
	hDIBTemp = gDib.CopyHandle(hDIB);
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	gheight = lpbi->biHeight;
	gwidth = lpbi->biWidth;
    m_nWndWidth = gwidth;
	m_nWndHeight=gheight ;
	gwBytesPerLine = gDib.BytePerLine(hDIB);
	GlobalUnlock(hDIB);

	return TRUE;
}

BOOL CFaceDetectDoc::OnOpenDocument1(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	if(hDIB1)
		GlobalFree(hDIB1);
	   path=lpszPathName;
	hDIB1 = gDib.LoadDIB(lpszPathName);
	ASSERT(hDIB1 != NULL);
	hDIBTemp1 = gDib.CopyHandle(hDIB1);
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB1);
	gheight = lpbi->biHeight;
	gwidth = lpbi->biWidth;
    m_nWndWidth = gwidth;
	m_nWndHeight=gheight ;
	gwBytesPerLine = gDib.BytePerLine(hDIB1);
	GlobalUnlock(hDIB);

	return TRUE;
}
///////////////////////获取图片数据//////////////////
void CFaceDetectDoc::OnREADYGetFaceOutLline() 
{
//	BYTE	*colorTable;
	if(!hDIB)
	{
		::AfxMessageBox("请确认是否有图片?");return ;
	}
	READYGetFaceOutLline1() ;

}

void CFaceDetectDoc::READYGetFaceOutLline1() 
{
	DIB *m_pMainDib=new DIB();

   //BYTE *m_pDib=m_pMainDib->GetBits();
	
//	colorTable = (BYTE *)m_pDib;

   //////////////////////////////////////////////////////
    HDIB hNewDIB = NULL;
	LPBITMAPINFOHEADER lpSrc,lpDest;
	LPBYTE lpS,lpD;
	DWORD dwBytesPerLine;
	DWORD dwImgSize;
//	WORD wBytesPerLine;
	unsigned i ,j,height,width;
	if(!hDIB)
		return ;
	
	lpSrc = (LPBITMAPINFOHEADER)GlobalLock(hDIB);

	dwBytesPerLine = WIDTHBYTES(24*(lpSrc->biWidth));
	dwImgSize = lpSrc->biHeight * dwBytesPerLine;
	//申请新的内存,大小等于原来图象的大小
	hNewDIB = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+dwImgSize);

	lpDest = (LPBITMAPINFOHEADER)GlobalLock(hNewDIB);
	//保存图片的长宽、颜色深度等信息
	
   	memcpy((void*)lpDest,(void*)lpSrc,sizeof(BITMAPINFOHEADER));
	
	DWORD dwSBytesPerLine;
	
	dwSBytesPerLine = (24*(lpSrc->biWidth)+31)/32*4;
	height = lpDest->biHeight;
	width = lpDest->biWidth;
	lpS = (LPBYTE)lpSrc;
//	wBytesPerLine = this->BytePerLine(hDIB);//
	lpD = (LPBYTE)lpDest;	
	lpS = lpS + sizeof(BITMAPINFOHEADER);
	lpD = lpD + sizeof(BITMAPINFOHEADER);
	
   ////////////////////////////////////////////////////
  
	int byteBitCount  = m_pMainDib->GetBiBitCount()/8;

	m_tOriPixelArray  = new RGBQUAD*[height];
	m_tResPixelArray  = new RGBQUAD*[height];

for(i=0; i<height; i++)
	{
		m_tOriPixelArray[i] = new RGBQUAD[width];
		m_tResPixelArray[i] = new RGBQUAD[width];
	
	}

    LPBYTE lpData;
	long lOffset;
	lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	for(i=0; i<height; i++)
	{
		for(j=0; j<width; j++)

		{  
			lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);

            m_tOriPixelArray[i][j].rgbBlue =*(lpData + lOffset++);
		    m_tOriPixelArray[i][j].rgbGreen=*(lpData + lOffset++);
			m_tOriPixelArray[i][j].rgbRed  =*(lpData + lOffset++);
			
			m_tOriPixelArray[i][j].rgbReserved = 0;

			m_tResPixelArray[i][j]=m_tOriPixelArray[i][j];
		
	
		}
	
	}
	m_nWndWidth=width;
    m_nWndHeight=height;

  method1 =new CLikelyHood(m_tOriPixelArray,m_nWndWidth,m_nWndHeight);
  
  Likehood(m_nWndWidth,m_nWndHeight) ;
  OnBtnBinary();
  
  HistogramV();
  OnBtnHistogramH();
  
  OnBtnMarkFace();
  ///////////////////////////////////////////////
  /*
 	for(int k1=top;k1<bottom; k1++)
		for(int k=left;k<right; k++)

            if(method1->m_pBinaryArray[k1][k]==1)
		{
			  lOffset = gDib.PixelOffset(k1, k, gwBytesPerLine);
               *(lpData+lOffset)=255;
               *(lpData+lOffset+1)=255;
			   *(lpData+lOffset+2)=255;
			   }
 */
////////////////////////////////////////////////////
  
}

////////////////////////////////////////////////////////////////////////////////
// 计算相似度
////////////////////////////////////////////////////////////////////////////////
void CFaceDetectDoc::Likehood(int m_WndWidth,int m_WndHeight) 
{
	int i,j;

	SetCursor(LoadCursor(NULL,IDC_WAIT));
    
	method1->CalLikeHood();

for( i=0; i<m_WndHeight; i++)
	for( j=0; j<m_WndWidth;  j++)
	{
		m_tResPixelArray[i][j].rgbBlue = m_tResPixelArray[i][j].rgbGreen =m_tResPixelArray[i][j].rgbRed=(int)(method1->m_pLikeliHoodArray[i][j]*255);
	    
	}
	//MakeBitMap();
  
	SetCursor(LoadCursor(NULL,IDC_ARROW));	
}

////////////////////////////////////////////////////////////////////////////////
// 二值化
////////////////////////////////////////////////////////////////////////////////
void CFaceDetectDoc::OnBtnBinary() 
{
	SetCursor(LoadCursor(NULL,IDC_WAIT));
	int i,j;
//	 long lOffset;
	 LPBYTE lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	if(!method1->CalBinary())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -