📄 facedetectdoc.cpp
字号:
// 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 + -