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

📄 facedetectview.cpp

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

#include "stdafx.h"
#include "FaceDetect.h"
#include "DIB.h"
#include "FaceDetectDoc.h"
#include "FaceDetectView.h"
#include "STUDY_1.h"
#include "Tishi.h"
#include "GetStudyNum.h "
#include "ShowPMessage.h"
#include "XiuGai.h"
#include "GetName.h"
#include "Message.h"
#include "shujuyanchi.h"
#include "Meg.h"
#include "DelectMessage.h"
#include "FINDMESSAGE.h"
#include "math.h"
#define WIDTHBYTES(bits)  ((bits+31)/32*4)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
DIB gDib;
 HANDLE hDIB;
 HANDLE hDIB1;
HANDLE hDIBTemp;
HANDLE hDIBTemp1;
 int gheight;
 int gwidth;
 WORD gwBytesPerLine;
 static int v_left,v_top,v_bottom,v_right;
 
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView

IMPLEMENT_DYNCREATE(CFaceDetectView, CView)

BEGIN_MESSAGE_MAP(CFaceDetectView, CView)
	//{{AFX_MSG_MAP(CFaceDetectView)
	ON_COMMAND(ID_READY_LIGHTINGCONPENSATE, OnReadyLightingconpensate)
	ON_COMMAND(ID_READY_SCALE, OnReadyScale)
	ON_COMMAND(ID_READY_ContrastEnhance, OnREADYContrastEnhance)
	ON_COMMAND(ID_READY_ZFT, OnReadyZft)
	ON_COMMAND(ID_READY_WHITEBLACK, OnReadyWhiteblack)
	ON_COMMAND(ID_READY_BanishOnlyPoint, OnREADYBanishOnlyPoint)
	ON_COMMAND(ID_READY_Mediumvalue, OnREADYMediumvalue)
	ON_COMMAND(ID_READY_DilationFirst, OnREADYDilationFirst)
	ON_COMMAND(ID_READY_Decay, OnREADYDecay)
	ON_COMMAND(ID_READY_OutLine, OnREADYOutLine)
	ON_COMMAND(ID_READY_FixedPosition, OnREADYFixedPosition)
	ON_COMMAND(ID_PROCESSING_GetCharacteristicParameter, OnPROCESSINGGetCharacteristicParameter)
	ON_COMMAND(ID_PROSSING_detect, OnPROSSINGdetect)
	ON_COMMAND(AFX_ID_VIDIO, OnIdVidio)
	ON_COMMAND(ID_VIDIO_CANNEL, OnVidioCannel)
	ON_COMMAND(AFX_ID_PROSSING, OnIdProssing)
	ON_COMMAND(ID_READY_Template, OnREADYTemplate)
	ON_BN_CLICKED(IDOK_GetName, OnGetName)
	ON_COMMAND(ID_PROSSING_STUDY, OnProssingStudy)
	ON_COMMAND(ID_DETECTFACE, OnDetectface)
	ON_COMMAND(ID_STUDY_MENUITEM32798, OnStudyMenuitem32798)
	ON_COMMAND(ID_DATABASE_FIND, OnDatabaseFind)
	ON_COMMAND(ID_DATABASE_Delete, OnDATABASEDelete)
	ON_COMMAND(ID_MENUITEM32799, OnMenuitem32799)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView construction/destruction

CFaceDetectView::CFaceDetectView()
{
	// TODO: add construction code here
	Study=0;
	pname="temp";
	Picture=1;
	Picture1=1;
	flagP=false;
	lpRgb = NULL;
	lpYcc = NULL;
	faceNum = 0;
	for(int i=0; i<ImgRange; i++)
		for (int j=0; j<ImgRange; j++)
		{
			this->emymapc[i][j] = false;
			this->emymapl[i][j] = false;
			this->lab[i][j] = false;
		}
	this->result = false;
       v_left=0;
	   v_top=0;
       v_bottom=0;
	   v_right=0;
	   GetFlag=0;
       FaceAere=false;
	   FaceLine=false;
	   FaceGray=false;
	   FaceGass=false;
	   FaceJunHeng=false;
	   FaceDbidu=false;
	   FaceTwo=false;
	   FaceGuLi=false;
	   FaceDingWei=false;
	   FaceTeZheng=false;
	   FaceShiBie=false;
}

CFaceDetectView::~CFaceDetectView()
{
}

BOOL CFaceDetectView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView drawing

void CFaceDetectView::OnDraw(CDC* pDC)
{
	CFaceDetectDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	   CPen NewPen1(PS_SOLID,2,RGB(255,0,0));
		 CPen *pOldPen=pDC->SelectObject(&NewPen1);
		   
	if(hDIB)
	{
	   
		gDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(500+100,10+50,gwidth+500+100,gheight+10+50),hDIB,CRect(0,0,gwidth,gheight),SRCCOPY);
         
		 //dc.SetROP2(R2_NOTXORPEN);
	
	} 
    
	 if(hDIB1)
        gDib.PaintDIBTrue1(pDC->GetSafeHdc(),CRect(500+100-300-100+150,10+300+50,820+100-300-100+150,250+300+50),hDIB1,CRect(0,0,gwidth,gheight),SRCCOPY);
    
	///////////////////////////识别图象框///////////////////
	      int x1=10+100;
		  int y1=10+50;
		  int x2=320+10+100;
		  int y2=240+10+50;
		 pDC->MoveTo(x1-5,y1-5);
		 pDC->LineTo(x1-5,y2+5);

		 pDC->MoveTo(x1-5,y2+5);
		 pDC->LineTo(x2+5,y2+5);

		 pDC->MoveTo(x2+5,y2+5);
		 pDC->LineTo(x2+5,y1-5);

		 pDC->MoveTo(x2+5,y1-5);
		 pDC->LineTo(x1-5,y1-5);
		
		 pDC->TextOut(80,100,"摄");
         pDC->TextOut(80,120,"像");
		 pDC->TextOut(80,140,"头");
		 
		 //dc.SetROP2(R2_NOTXORPEN);
//////////////////////摄像头框////////////////////////
		   x1=500+100;
		   y1=10+50;
		   x2=820+100;
		   y2=250+50;
		 pDC->MoveTo(x1-5,y1-5);
		 pDC->LineTo(x1-5,y2+5);

		 pDC->MoveTo(x1-5,y2+5);
		 pDC->LineTo(x2+5,y2+5);

		 pDC->MoveTo(x2+5,y2+5);
		 pDC->LineTo(x2+5,y1-5);

		 pDC->MoveTo(x2+5,y1-5);
		 pDC->LineTo(x1-5,y1-5);
         pDC->TextOut(80+490,100,"识");
         pDC->TextOut(80+490,120,"别");
		 pDC->TextOut(80+490,140,"图");
         pDC->TextOut(80+490,160,"像");
		
		
/////////////////////////////////标准图象框/////////////////////////////////////
		 CPen NewPen2(PS_SOLID,2,RGB(0,255,0));
		 CPen *pOldPen2=pDC->SelectObject(&NewPen2);
		  x1=500+100-300-100+150;
		   y1=10+300+50;
		   x2=820+100-300-100+150;
		   y2=250+300+50;
		 pDC->MoveTo(x1-5,y1-5);
		 pDC->LineTo(x1-5,y2+5);

		 pDC->MoveTo(x1-5,y2+5);
		 pDC->LineTo(x2+5,y2+5);

		 pDC->MoveTo(x2+5,y2+5);
		 pDC->LineTo(x2+5,y1-5);

		 pDC->MoveTo(x2+5,y1-5);
		 pDC->LineTo(x1-5,y1-5);
         pDC->TextOut(500+100-300-100-30+150,10+300+50+40,"标");
         pDC->TextOut(500+100-300-100-30+150,10+300+50+40+20,"准");
		 pDC->TextOut(500+100-300-100-30+150,10+300+50+40+40,"图");
		 pDC->TextOut(500+100-300-100-30+150,10+300+50+60+40,"像");
	// TODO: add draw code for native data here
         
}

/*
void CFaceDetectView::OnInitialUpdate()
{
   CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	//TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}
*/
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView printing
void CFaceDetectView::DrawLine(int left,int top,int bottom ,int right)
{
       v_left=0;
	   v_top=0;
       v_bottom=0;
	   v_right=0;
	   v_left=left;
	   v_top=bottom;                              
       v_bottom=top;
	   v_right=right;
       LPBYTE lpData;
	  long lOffset;
	  FaceAere=true;
	  lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);

     for( int i=v_left; i<v_right; i++)
	 {

              lOffset = gDib.PixelOffset( v_top,i, gwBytesPerLine);
                *(lpData + lOffset)=0;
			    *(lpData + lOffset+1)=0;
				*(lpData + lOffset+2)=255;
             lOffset = gDib.PixelOffset( v_bottom,i, gwBytesPerLine);
			 *(lpData + lOffset)=0;
			  *(lpData + lOffset+1)=0;
			 *(lpData + lOffset+2)=255;
	 }

	for(int j=v_bottom; j<v_top; j++)
	{
		  lOffset = gDib.PixelOffset( j,v_left, gwBytesPerLine);
          *(lpData + lOffset)=0;
		  *(lpData + lOffset+1)=0;
		  *(lpData + lOffset+2)=255;
          lOffset = gDib.PixelOffset( j,v_right, gwBytesPerLine);
		  *(lpData + lOffset)=0;
		  *(lpData + lOffset+1)=0;
		  *(lpData + lOffset+2)=255;
	}
	 
/*	for(i=0;i<5;i++)
     {  int H=((v_right-v_left)/5)*i+v_left;
	 for(j=v_bottom; j<v_top;  j++)
		{
		  lOffset = gDib.PixelOffset( j,H, gwBytesPerLine);
          *(lpData + lOffset)=0;
		  *(lpData + lOffset+1)=0;
		  *(lpData + lOffset+2)=255;
	 }
	 }
 
for( i=v_left; i<v_right; i++)
	 {

              lOffset = gDib.PixelOffset( (v_top+v_bottom)/2,i, gwBytesPerLine);
                *(lpData + lOffset)=0;
			    *(lpData + lOffset+1)=0;
				*(lpData + lOffset+2)=255;
             
	 }
for( i=v_bottom; i<v_top; i++)
	 {

              lOffset = gDib.PixelOffset( i,(v_left+v_right)/2, gwBytesPerLine);
                *(lpData + lOffset)=0;
			    *(lpData + lOffset+1)=0;
				*(lpData + lOffset+2)=255;
             
	 }
  */	
	 //////////////////////////////////////////////////////////////////////////////////////////////
    //Invalidate();

	
}

BOOL CFaceDetectView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CFaceDetectView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CFaceDetectView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView diagnostics

#ifdef _DEBUG
void CFaceDetectView::AssertValid() const
{
	CView::AssertValid();
}

void CFaceDetectView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CFaceDetectDoc* CFaceDetectView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFaceDetectDoc)));
	return (CFaceDetectDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView message handlers

void CFaceDetectView::OnReadyLightingconpensate() 
{
	// TODO: Add your command handler code here
	if(FaceAere)
	{
		::AfxMessageBox("请确认脸部区域是否获取?");
		return ;
	}
	ReadyLightingconpensate2(); 
    FaceLine=true;
	FaceAere=false;
}

void CFaceDetectView::ReadyLightingconpensate2() 
{
	hDIBTemp = gDib.CopyHandle(hDIB);
	gDib.LightingCompensate(hDIB);
	GlobalUnlock(hDIB);
	Invalidate();
}

void CFaceDetectView::OnReadyScale() 
{
	// TODO: Add your command handler code here
	if(!FaceLine)
	{
		::AfxMessageBox("请确认是否进行补光处理?");
		return ;
	}
    ReadyScale3();
	FaceGray=true;
    FaceLine=false;
}

void CFaceDetectView::ReadyScale3() 
{
	LPBYTE lpData;
	long lOffset;
	lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	unsigned ColorR,ColorG,ColorB,gray;
	Gray= new int*[v_top-v_bottom+1];
	

	int k;
	for( k=0;k<v_top-v_bottom+1;k++)
     Gray[k]=new int [v_right-v_left+1];
      int k1,i,j;
	  
	for(i=v_bottom,k=0; i<=v_top; i++,k++)
	{
		for(j=v_left,k1=0; j<=v_right; j++,k1++)

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

           ColorB=*(lpData + lOffset);
		   ColorG=*(lpData + lOffset+1);
		   ColorR=*(lpData + lOffset+2);
		   gray = (ColorG*50+ColorR*39+ColorB*11)/100;	
//		   *(lpData + lOffset)=gray ;
//		   *(lpData + lOffset+1)=gray ;
//		   *(lpData + lOffset+2)=gray ;
		    Gray[k][k1]=gray;

		}
	
	}

///////////////////////////////////////////////////////////////////////////
/*
int sumDCT=0;
int Au,Av;
int u,v,x,y;
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	gheight = lpbi->biHeight;
	gwidth = lpbi->biWidth;
for(u=0; u<100; u++)
	for( v=0; v<100; v++)
		{
       for(x=0; x<100; x++)
		for( y=0; y<10; y++)
		{  lOffset = gDib.PixelOffset(x, y, gwBytesPerLine);
	    	
		    sumDCT=sumDCT+(*(lpData + lOffset))*cos((((2*x+1)*u*3.1415926))/((v_top-v_bottom+1)*2))*cos((((2*y+1)*v*3.1415926))/((v_left-v_right+1)*2));
		}
		
		if(u==0)
			Au=1/sqrt(v_top-v_bottom+1);
		else
			Au=sqrt(2/(v_top-v_bottom+1));
		if(v==0)
			Av=1/sqrt(v_right-v_left+1);
		else
			Av=sqrt(2/(v_right-v_left+1));
	//	::AfxMessageBox("只能对宽度和高度相等的图像进行方块编码!");
		sumDCT=Av*Au*sumDCT;
		 lOffset = gDib.PixelOffset(u, v, gwBytesPerLine);
            *(lpData + lOffset)=sumDCT ;
		    *(lpData + lOffset+1)=sumDCT ;
		    *(lpData + lOffset+2)=sumDCT;

		}
		*/
//////////////////////////////////////////////////////////////////////////


   Invalidate();
  
	
}


//函数说明:该函数实现图像对比度增强的功能
void CFaceDetectView::OnREADYContrastEnhance() 
{
	// TODO: Add your command handler code here
	if(!FaceJunHeng)
	{
		::AfxMessageBox("请确认是否进行直方图均衡?");
		return ;
	}
	READYContrastEnhance6();
    FaceJunHeng=false;
	FaceDbidu=true;
}

void CFaceDetectView::READYContrastEnhance6()
{
	LPBYTE lpData;
	long lOffset;
	lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);

	Icd= new int*[v_top-v_bottom+1];
	int k,i;
	for( k=0;k<v_top-v_bottom+1;k++)
     Icd[k]=new int [v_right-v_left+1];

	for( i=v_bottom,k=0; i<=v_top; i++,k++)
		for(int j=v_left,k1=0; j<=v_right; j++,k1++)
		{
           lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
           int state=IncreaseContrast(ZFT[k][k1], 100);    
//         *(lpData + lOffset)=state ;
//		   *(lpData + lOffset+1)=state ;
//		   *(lpData + lOffset+2)=state ;
		   Icd[k][k1]=state;

		}
		 
	Invalidate();

}
int  CFaceDetectView::IncreaseContrast(int pByte,int n)
{
  //根据参数n来调节对比度,n越大,对比越强烈
	int Low = n;
	int High = 255-n;
	float Grad = ((float)(High-Low))/255;

⌨️ 快捷键说明

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